common-lisp
प्रत्यावर्तन
खोज…
टिप्पणियों
लिस्प का उपयोग अक्सर शैक्षिक संदर्भों में किया जाता है, जहां छात्र पुनरावर्ती एल्गोरिदम को समझना और लागू करना सीखते हैं।
कॉमन लिस्प या पोर्टेबल कोड में लिखे गए प्रोडक्शन कोड में रिकर्सन के साथ कई समस्याएँ हैं: वे टेल-कॉल ऑप्टिमाइज़ेशन जैसी कार्यान्वयन-विशिष्ट सुविधाओं का उपयोग नहीं करते हैं, अक्सर पुनरावृत्ति से बचने के लिए इसे पूरी तरह से आवश्यक बनाते हैं। इन मामलों में, कार्यान्वयन:
- आमतौर पर स्टैक आकारों में सीमा के कारण एक पुनरावृत्ति गहराई सीमा होती है । इस प्रकार पुनरावर्ती एल्गोरिदम केवल सीमित आकार के डेटा के लिए काम करेंगे।
- हमेशा पूंछ कॉल का अनुकूलन प्रदान न करें, विशेष रूप से गतिशील रूप से स्कोप किए गए संचालन के साथ संयोजन में।
- केवल कुछ अनुकूलन स्तरों पर पूंछ कॉल का अनुकूलन प्रदान करते हैं।
- आमतौर पर पूंछ कॉल अनुकूलन प्रदान न करें ।
- आमतौर पर कुछ प्लेटफार्मों पर पूंछ कॉल अनुकूलन प्रदान नहीं करते हैं। उदाहरण के लिए, JVM पर कार्यान्वयन ऐसा नहीं हो सकता है, क्योंकि JVM स्वयं टेल कॉल ऑप्टिमाइज़ेशन का समर्थन नहीं करता है।
जंप के साथ टेल कॉल को बदलना आमतौर पर डिबगिंग को और अधिक कठिन बना देता है; जंप जोड़ने से स्टैक फ्रेम डिबगर में अनुपलब्ध हो जाएगा। विकल्प के रूप में आम लिस्प प्रदान करता है:
- Iteration constructs, जैसे
DO
,DOTIMES
,LOOP
, और अन्य -
MAP
,REDUCE
, और अन्य जैसे उच्च-क्रम के कार्य - निम्न स्तर सहित विभिन्न नियंत्रण संरचनाओं,
go to
पुनरावृत्ति टेम्पलेट 2 बहु-स्थिति
(defun fn (x)
(cond (test-condition1 the-value1)
(test-condition2 the-value2)
...
...
...
(t (fn reduced-argument-x))))
CL-USER 2788 > (defun my-fib (n)
(cond ((= n 1) 1)
((= n 2) 1)
(t (+
(my-fib (- n 1))
(my-fib (- n 2))))))
MY-FIB
CL-USER 2789 > (my-fib 1)
1
CL-USER 2790 > (my-fib 2)
1
CL-USER 2791 > (my-fib 3)
2
CL-USER 2792 > (my-fib 4)
3
CL-USER 2793 > (my-fib 5)
5
CL-USER 2794 > (my-fib 6)
8
CL-USER 2795 > (my-fib 7)
13
पुनरावर्तन टेम्पलेट 1 एकल स्थिति एकल पूंछ पुनरावृत्ति
(defun fn (x)
(cond (test-condition the-value)
(t (fn reduced-argument-x))))
कंप्यूट एनबी फाइबोनैचि संख्या
;;Find the nth Fibonacci number for any n > 0.
;; Precondition: n > 0, n is an integer. Behavior undefined otherwise.
(defun fibonacci (n)
(cond
( ;; Base case.
;; The first two Fibonacci numbers (indices 1 and 2) are 1 by definition.
(<= n 2) ;; If n <= 2
1 ;; then return 1.
)
(t ;; else
(+ ;; return the sum of
;; the results of calling
(fibonacci (- n 1)) ;; fibonacci(n-1) and
(fibonacci (- n 2)) ;; fibonacci(n-2).
;; This is the recursive case.
)
)
)
)
किसी सूची के तत्वों को पुन: मुद्रित करें
;;Recursively print the elements of a list
(defun print-list (elements)
(cond
((null elements) '()) ;; Base case: There are no elements that have yet to be printed. Don't do anything and return a null list.
(t
;; Recursive case
;; Print the next element.
(write-line (write-to-string (car elements)))
;; Recurse on the rest of the list.
(print-list (cdr elements))
)
)
)
इसे जांचने के लिए, दौड़ें:
(setq test-list '(1 2 3 4))
(print-list test-list)
परिणाम होगा:
1
2
3
4
एक पूरी संख्या के भाज्य की गणना करें
एक पुनरावर्ती कार्य के रूप में लागू करने के लिए एक आसान एल्गोरिथ्म भाज्य है।
;;Compute the factorial for any n >= 0. Precondition: n >= 0, n is an integer.
(defun factorial (n)
(cond
((= n 0) 1) ;; Special case, 0! = 1
((= n 1) 1) ;; Base case, 1! = 1
(t
;; Recursive case
;; Multiply n by the factorial of n - 1.
(* n (factorial (- n 1)))
)
)
)
Modified text is an extract of the original Stack Overflow Documentation
के तहत लाइसेंस प्राप्त है CC BY-SA 3.0
से संबद्ध नहीं है Stack Overflow