मैं हाल ही में लर्न यू हास्केल फॉर ग्रेट गुड गाइड के माध्यम से जा रहा हूं और अभ्यास के रूप में मैं इसके साथ प्रोजेक्ट यूलर समस्या 5 को हल करना चाहता था , जो निर्दिष्ट करता है:
1 से 20 तक की सभी संख्याओं में समान रूप से विभाज्य सबसे छोटी धनात्मक संख्या क्या है?
मैंने पहले यह निर्धारित करने के लिए एक फ़ंक्शन लिखने का फैसला किया कि क्या किसी संख्या को इन संख्याओं द्वारा विभाजित किया गया है:
divisable x = all (\y -> x `mod` y == 0)[1..20]
तब मैंने सबसे छोटे का उपयोग करके गणना की head
:
sm = head [x | x <- [1..], divisable x]
और अंत में परिणाम प्रदर्शित करने के लिए लाइन लिखी:
main = putStrLn $ show $ sm
दुर्भाग्य से इसे समाप्त होने में लगभग 30 सेकंड का समय लगा। 1 से 10 की संख्या के साथ एक ही काम करने से परिणाम लगभग तुरंत मिलता है, लेकिन फिर 1 से 20 के लिए समाधान की तुलना में फिर से परिणाम बहुत छोटा है।
मैंने इसे पहले सी में हल किया था और 1 से 20 के लिए परिणाम भी लगभग तुरंत गणना की गई थी। यह मुझे विश्वास दिलाता है कि मैं गलत समझ रहा हूं कि हास्केल के लिए इस समस्या की व्याख्या कैसे करें। मैंने अन्य लोगों के समाधानों को देखा और पाया:
main = putStrLn $ show $ foldl1 lcm [1..20]
उचित रूप से, यह बिल्ट-इन फ़ंक्शन का उपयोग करता है, लेकिन अंतिम परिणाम इतना धीमा क्यों होता है जब इसे स्वयं करते हैं? वहाँ के ट्यूटोरियल आपको हास्केल का उपयोग करने का तरीका बताते हैं, लेकिन मैं एल्गोरिदम को तेज़ कोड में बदलने में बहुत मदद नहीं करता।