कार्यक्रम फिबोनैकी श्रृंखला के n वें नंबर प्रिंट करता है।
यह प्रोग्राम कुछ भी प्रिंट नहीं करता है। यदि आप आउटपुट देख रहे हैं, तो शायद यह है कि आप इसे रीड-eval- प्रिंट -loop (REPL) से कॉल कर रहे हैं, जो एक फॉर्म पढ़ता है, इसका मूल्यांकन करता है, और फिर प्रिंट परिणाम देता है। उदाहरण के लिए, तुम क्या कर किया जा सकता है:
CL-USER> (fibonacci 4)
2
आप कुछ में है कि कॉल लिपटे तो बाकी है, हालांकि, आप देखेंगे कि यह मुद्रण नहीं कर रहा है कुछ भी:
CL-USER> (progn (fibonacci 4) nil)
NIL
आप इस प्रश्न के लिखित मिल गया है के रूप में, प्रत्येक फाइबोनैकी संख्या को मुद्रित करने के लिए इसे एक बार संशोधित करना मुश्किल होगा, क्योंकि आप बहुत अनावश्यक गणना करते हैं। उदाहरण के लिए,
(fibonacci (- n 1))
करने के लिए कॉल (fibonacci (- n 1))
गणना होगी, लेकिन इतना
(fibonacci (- n 2))
के लिए सीधी कॉल इसका मतलब है कि आप शायद fibonacci
की प्रत्येक कॉल पूरे अनुक्रम मुद्रित करने के लिए नहीं करना चाहते हैं जाएगा। यदि आप करते हैं, हालांकि, ध्यान दें कि (print x)
x
का मान देता है, तो आप बस कर सकते हैं:
(defun fibonacci(n)
(cond
((eq n 1) 0)
((eq n 2) 1)
((print (+ (fibonacci (- n 1)) (fibonacci (- n 2)))))))
CL-USER> (progn (fibonacci 6) nil)
1
2
1
3
1
2
5
NIL
आप कुछ दोहराया भागों वहाँ देखेंगे, वहाँ के बाद से अनावश्यक गणना।आप अधिक कुशलता से श्रृंखला गणना कर सकता है, हालांकि, पहले दो नंबर से शुरू, और ऊपर की गणना के द्वारा:
(defun fibonacci (n)
(do ((a 1 b)
(b 1 (print (+ a b)))
(n n (1- n)))
((zerop n) b)))
CL-USER> (fibonacci 6)
2
3
5
8
13
21
वास्तव में, मुझे रिवर्स फ़ंक्शन का उपयोग करने की अनुमति नहीं है। मुझे इसे एक भी पुनरावर्ती फ़ंक्शन में करना है, बिना किसी अंतर्निहित फ़ंक्शन को रिवर्स। फिर भी धन्यवाद। – wackyTechie
@wackyTechie आपको अपने प्रश्न में प्रतिबंधों का उल्लेख करना चाहिए। मैंने जोड़ा है कि बिना किसी संचयक के इसे कैसे किया जाए। – Sylwester
हाँ, बाद में इसका एहसास हुआ। आपका बहुत बहुत धन्यवाद! – wackyTechie