मैं हास्केल सीख रहा हूँ, और मैं एक साधारण फाइबोनैचि समारोह लिखा है: GHCi आरईपीएल मैं कुछ संख्या के साथ गड़बड़ के आसपास सकता है मेंहास्केल फाइबोनैचि लगता धीमी
fib :: Int -> Int
fib 1 = 1
fib 0 = 0
fib n = (fib (n-1)) + (fib (n-2))
ठीक संकलित करने के लिए लगता है, और लोड हो रहा है इस स्क्रिप्ट । मैं
fib 33
की कोशिश की और आश्चर्य हुआ कि इसके बारे में 4 सेकंड ले लिया परिणाम देने के लिए। (क्षमा करें मुझे नहीं पता कि हास्केल में अभी तक फ़ंक्शन कैसे करें, इसलिए स्वयं को गिनें)।
फिब 33 विशेष रूप से कर नहीं लगा रहा है। जवाब 4 मिलियन से भी कम है। तो मुझे लगता है कि मेरा कोड बहुत अच्छी तरह लिखा नहीं गया है या जिस तरह से मैं रिकर्सन कर रहा हूं, उसके साथ कुछ समस्या है (ठीक है, यह अच्छी तरह से लिखा नहीं गया है कि यह नकारात्मक नकारात्मक पूर्णांक नहीं लेता है)। सवाल यह है, यह धीमा क्यों है? किसी भी मदद की सराहना की।
यह सवाल CodeReview के लिए एक अच्छा एक हो रहा है। – Alexander
अपने कोड को देखते समय, बस कल्पना करें कि उदाहरण के लिए कितनी बार 'fib (5)' की गणना की जाती है। प्रत्येक पुनरावृत्ति, आप फिर से सभी "आंतरिक" फाइबोनैकी संख्याओं की गणना करते हैं। – WeSt
आपको क्लासिक आलसी अनंत सूची संस्करण का उपयोग करना चाहिए: 'fibs = 0: 1: zipWith (+) fibs (पूंछ fibs) '' fib n = fibs !! n' के साथ। देखें [फिबोनैकी अनुक्रम के बारे में हैकेल विकी] (https://www.haskell.org/haskellwiki/The_Fibonacci_sequence)।यह मनोरंजक है कि फिबोनैकी इस अनुक्रम के लिए प्रसिद्ध है, जो उस पुस्तक में थोड़ा सा अभ्यास था जिसके लिए उसे प्रसिद्ध होना चाहिए, जिसने पश्चिमी यूरोप में जगह मूल्य पेश किया। – AndrewC