मैं निम्नलिखित, हास्केल में वें फिबोनैकी संख्या की गणना के लिए बार-बार उद्धृत कोड:गैर pointfree शैली काफी हद तक धीमी है
fibonacci :: Int -> Integer
fibonacci = (map fib [0..] !!)
where fib 0 = 0
fib 1 = 1
fib n = fibonacci (n-2) + fibonacci (n-1)
इस का उपयोग करना, मैं इस तरह के रूप में कॉल कर सकते हैं:
ghci> fibonacci 1000
और लगभग तात्कालिक उत्तर प्राप्त करें।
हालांकि, इतना है कि यह pointfree शैली में नहीं है, अगर मैं उपरोक्त कोड संशोधित अर्थात
fibonacci :: Int -> Integer
fibonacci x = (map fib [0..] !!) x
where fib 0 = 0
fib 1 = 1
fib n = fibonacci (n-2) + fibonacci (n-1)
यह काफी हद तक धीमी है। इस हद तक कि
ghci> fibonacci 1000
लटका जैसे कॉल।
मेरी समझ यह थी कि कोड के उपरोक्त दो टुकड़े बराबर थे, लेकिन जीएचसीआई अलग होना चाहता था। क्या किसी के पास इस व्यवहार के लिए स्पष्टीकरण है?
पहली परिभाषा 'fibonacci = let k = map fib [0 ..] में \ x -> k !! x'। यह शायद हर बार पुन: कंप्यूटिंग के बजाय परिणामों की सूची साझा करता है। – melpomene
एमएम, इसलिए मैं संतुष्ट हूं कि यह "साझाकरण" (ज्ञापन) है जो पहले एक सुपर त्वरित बनाता है। लेकिन दूसरे के लिए ऐसा क्यों करें? – MadMonty
आप बिना अनुकूलन के जीएचसीआई में अपना कोड चला रहे हैं। '-O2' के साथ दोनों कार्यों को संकलित करने का प्रयास करें और देखें कि क्या जीएचसी आपके लिए अपनी समस्या का समाधान करने के लिए पर्याप्त स्मार्ट है। – user2407038