मैं स्टुअर्ट हेलोवे की पुस्तक प्रोग्रामिंग क्लोजर के माध्यम से काम करने की कोशिश कर रहा हूं। यह पूरी कार्यात्मक सामग्री मेरे लिए बहुत नई है।क्लोजर फ़ंक्शन (एनटी [कॉल इंडेक्स]) और संरचना (अंतिम (इंडेक्स कॉल लेना) के बीच क्या अंतर है)
मैं समझता हूँ कि कैसे
(defn fibo[]
(map first (iterate (fn [[a b]] [b (+ a b)]) [0 1])))
फाइबोनैचि अनुक्रम lazily उत्पन्न करता है। मुझे समझ नहीं आता क्यों
(last (take 1000000 (fibo)))
काम करता है, जबकि
(nth (fibo) 1000000)
एक OutOfMemoryError फेंकता है। क्या कोई यह बता सकता है कि ये दो अभिव्यक्ति कैसे भिन्न हैं? क्या (एनएच) किसी भी तरह अनुक्रम के सिर पर पकड़ रहा है?
धन्यवाद!
न तो इन काम के: 1.3.0 में ठीक से काम करने के लिए अपने FIBO प्राप्त करने के लिए आप गणित कार्यों कि bignums को संख्या को बढ़ावा देंगे उपयोग करने के लिए की जरूरत है।कॉम के रूप में संख्या इतनी बड़ी है कि यह एक अतिप्रवाह का कारण बनता है। AFAICT आप किसी भी चीज़ का संदर्भ नहीं रखते हैं इसलिए मुझे विश्वास नहीं है कि "सिर पर पकड़ना" है। क्या आपको यकीन है कि यह सिर्फ इसलिए नहीं है क्योंकि संख्या इतनी बड़ी है कि बड़ी संख्या में क्या है? –
अंतिम कार्यान्वयन एक सीधी आगे ओ (एन) पूंछ-पुनरावर्ती कार्यान्वयन है, और यह किसी भी चीज़ पर नहीं है। एनएच जावा में लागू किया गया है और मुझे पूरा यकीन है कि यह किसी भी चीज़ पर नहीं है। इसलिए, आपके दोनों अनुक्रमों को ठीक काम करना चाहिए (सिद्धांत में)। एकमात्र चीज जिसे मैं सोच सकता हूं, हालांकि मैं इस पर स्पष्ट नहीं हूं परिणाम को प्रभावित करता है, यह है कि आपकी एनटी कॉल वास्तव में आपके अंतिम कॉल की तुलना में 1 आइटम की गणना करती है। nth 1000000 = 1000001st आइटम (0 अनुक्रमण) – vedang
@vedang धन्यवाद ... मैं उस महत्वपूर्ण भेद को नहीं पकड़ा होता। यह मेरी समस्या का स्रोत नहीं था, हालांकि मुझे एहसास नहीं हुआ था कि लेने का तर्क अनुक्रम का आकार है, जबकि एनएच के लिए तर्क सूचकांक है। – Josh