मैं पर Andy के answer में सुधार करने की कोशिश की है देखना चाहते हैं, लेकिन वह काफी इसे किसी न किसी। पहला समाधान धाराओं का एक पिरामिड बना रहा है - प्रत्येक कॉल fib
अन्य फाइबोनैकी स्ट्रीम बनाता है, और इनमें से प्रत्येक नई स्ट्रीम स्वयं नई स्ट्रीम तैयार करेगी, और इसी तरह।
स्पष्ट है कि, वहाँ fib
करने के लिए तीन धाराओं एक फोन से उत्पन्न कर रहे हैं:
- एक
fib zip fib.tail
- एक
map
द्वारा बनाई में fib zip fib.tail
- एक
fib.tail
द्वारा बनाई में fib
द्वारा बनाई गई (याद रखें, map
एक नया संग्रह बनाता है)
चूंकि पहले दो को fib
पर कॉल किया गया है, इसलिए वे प्रत्येक तीन स्ट्रीम बनाएंगे, और इसी तरह।
यहाँ एक किसी न किसी तरह यह "तस्वीर" है:
1
1
1 2 1
1 3 1 2 1
1 2 1 5 1 3 1 2 1
1 3 1 2 1 8 1 2 1 5 1 3 1 2 1
और इस पर और पर चला जाता है। मध्यम धारा को उच्चतम धाराओं का उपयोग करके बाएं और दाएं (फिब और fib.tail) पर गणना की जाती है। उनमें से प्रत्येक को पर पर निचले स्ट्रीम का उपयोग करके गणना की जाती है। इन निचली धाराओं में से प्रत्येक को अंतिम पंक्ति पर दिखाए गए धाराओं का उपयोग करके गणना की जाती है।
हम इसे चालू और जारी रख सकते हैं, लेकिन आप देख सकते हैं कि जब तक हमने 8 की गणना की, तब तक हमारे पास पहले से ही 14 अन्य फाइबोनैकी धाराएं चल रही हैं।
आप val
को def
से बदलते हैं, तो इन सभी नए धाराओं, गायब हो जाते हैं क्योंकि fib
और fib.tail
एक मौजूदा बजाय नई धाराओं बनाने की धारा के पास भेजेगा। और चूंकि कोई नई स्ट्रीम नहीं बनाई जाएगी, fib
और fib.tail
पर कोई और कॉल नहीं होगी।
अब, यदि आप दूसरे उत्तर को देखते हैं, तो आप देखेंगे कि एक fib
कॉल है, और map
या इसी तरह की विधि नहीं है, इसलिए कोई गुणा प्रभाव नहीं है।
स्रोत
2012-01-04 13:21:38
कोई उदाहरण पूंछ रिकर्सिव नहीं है। –
@ डैनियलसी। सोब्राल क्या आप समझा सकते हैं कि दूसरा कार्यान्वयन 'ओ (1)' में प्रत्येक फिबोनाची संख्या की गणना क्यों करता है लेकिन पहला व्यक्ति इसे 'ओ (एन) ' – Michael
में करता है ओह क्षमा करें ... मैं पहले के बारे में बात कर रहा था .. मुझे अपनी टिप्पणी को हटाने दें ... –