मैं प्रोजेक्ट यूलर समस्या 14 पर काम कर रहा हूं। यह मेरा समाधान है।यह हास्केल अभिव्यक्ति इतनी धीमी क्यों है?
import Data.List
collatzLength :: Int->Int
collatzLength 1 = 1
collatzLength n | odd n = 1 + collatzLength (3 * n + 1)
| even n = 1 + collatzLength (n `quot` 2)
maxTuple :: (Int, Int)->(Int, Int)->Ordering
maxTuple (x1, x2) (y1, y2) | x1 > y1 = GT
| x1 < y1 = LT
| otherwise = EQ
मैं निम्नलिखित चल रहा हूँ GHCi
कीmaximumBy maxTuple [(collatzLength x, x) | x <- [1..1000000]]
मुझे पता है कि अगर हास्केल सख्ती से मूल्यांकन किया है, इस पर समय O (n) की तरह कुछ होगा बाहर। चूंकि हास्केल आलसी मूल्यांकन करता है, ऐसा लगता है कि यह एन के कुछ निरंतर एकाधिक होना चाहिए। यह लगभग एक घंटे के लिए चल रहा है। बहुत अनुचित लगता है। क्या किसी को कोई विचार है क्यों?
मैं नहीं दिख रहा है यही कारण है कि हास्केल के आलस्य इस की जटिलता को कोई फर्क चाहिए कलन विधि। – sepp2k
आपका फ़ंक्शन 'collatzLength' पूंछ-पुनरावर्ती नहीं है। यह फ़ंक्शन को धीमा कर देता है और अनियंत्रित आवंटन का कारण बनता है। और आपका 'maxTuple'' fst की तुलना 'जैसा ही है। – fuz
@sepp मुझे वास्तव में नहीं पता कि सूची समझ कैसे लागू की जाती है। यदि वे मानचित्र का उपयोग कर रहे हैं, यदि हास्केल ने कड़ाई से मूल्यांकन किया है, तो ऐसा लगता है कि इसे कई बार सूची से गुजरना होगा। –