मान लीजिए कि आप एक पुनरावर्ती समारोह एक लेट ब्लॉक में परिभाषित करते हैं:क्या रिकर्सिव चलो एफएन को याद करने का कोई आसान तरीका है?
(let [fib (fn fib [n]
(if (< n 2)
n
(+ (fib (- n 1))
(fib (- n 2)))))]
(fib 42))
यह यंत्रवत् memoize
उपयोग करने के लिए परिवर्तित किया जा सकता:
- लपेटें
memoize
के लिए एक कॉल मेंfn
प्रपत्र। - फ़ंक्शन नाम को पहले तर्क के रूप में ले जाएं।
- जहां भी इसे कहा जाता है, फ़ंक्शन को अपने आप पास करें।
partial
का उपयोग करके फ़ंक्शन प्रतीक को रीबंड करें।
उपरोक्त कोड को बदलने के लिए सुराग के लिए:
(let [fib (memoize
(fn [fib n]
(if (< n 2)
n
(+ (fib fib (- n 1))
(fib fib (- n 2))))))
fib (partial fib fib)]
(fib 42))
यह काम करता है, लेकिन बहुत ज्यादा जटिल लगता है। सवाल यह है: क्या कोई आसान तरीका है?
आपको इस मामले में टीसीओ का उपयोग करना चाहिए ('लूप' का उपयोग करके क्लोजर में सामान्य परिभाषा में टीसीओ नहीं है)। – Hauleth
@ हॉउलेथ यह प्रश्न एक लेट ब्लॉक के संदर्भ में परिभाषित मनमाना रिकर्सिव फ़ंक्शन को ज्ञापन को कैसे लागू करें, इस बारे में है। यह विशेष पेड़-पुनरावर्ती फाइबोनैकी फॉर्मूलेशन केवल इसलिए उपयोग किया जाता है क्योंकि यह ज्ञापन के लाभों को दर्शाते हुए एक प्रसिद्ध सरल उदाहरण है। निश्चित रूप से, फाइबोनैकी संख्याओं के ढेर-अनुकूल गणना एक अलग दृष्टिकोण लेते हैं। –