हास्केल सीखने में मेरी सहायता के लिए, मैं प्रोजेक्ट यूलर की समस्याओं के माध्यम से काम कर रहा हूं। प्रत्येक समस्या को हल करने के बाद, मैं बेहतर कोडिंग प्रथाओं को सीखने के प्रयास में हास्केल विकी के खिलाफ अपना समाधान जांचता हूं।यह हास्केल कोड स्निपेट क्यों असीमित रूप से रिकर्सिव नहीं है?
primes = 2 : filter ((==1) . length . primeFactors) [3,5..]
primeFactors n = factor n primes
where
factor n (p:ps)
| p*p > n = [n]
| n `mod` p == 0 = p : factor (n `div` p) (p:ps)
| otherwise = factor n ps
problem_3 = last (primeFactors 317584931803)
इस बात का मेरे अनुभवहीन पढ़ने कि primes
primeFactors
, जो primes
के संदर्भ में परिभाषित किया गया है के रूप में परिभाषित किया गया है: यहाँ the solutionproblem 3 है। इसलिए primeFactors 9
का मूल्यांकन इस प्रक्रिया का पालन करेगा:
factor 9 primes
का मूल्यांकन करें।- अपने पहले तत्व के लिए
primes
पूछें, जो 2. - अपने अगले तत्व के लिए
primes
से पूछें। - इस प्रक्रिया के हिस्से के रूप में,
primeFactors 3
का मूल्यांकन करें। - अपने पहले तत्व के लिए
primes
पूछें, जो 2. - अपने अगले तत्व के लिए
primes
से पूछें। - इस प्रक्रिया के हिस्से के रूप में,
primeFactors 3
का मूल्यांकन करें। - ...
दूसरे शब्दों में, चरण 2-4 असीम दोहराने जाएगा। स्पष्ट रूप से मैं गलत हूं, क्योंकि एल्गोरिदम समाप्त हो जाता है। मैं यहाँ क्या गलती कर रहा हूँ?
क्योंकि, जैसा कि उत्तर यहां कहते हैं, 'प्राइम फैक्टरर्स' केवल प्राइम तक पहुंचता है जब तक कि प्राइम के वर्ग का परीक्षण नहीं किया जाता है, वह कोड 'primes = 2: [n | n <- [3 ..], सभी ((> 0) .rem n) $ takeWhile ((<= n)। (^ 2)) primes] 'जो स्पष्ट रूप से गैर-लूपिंग है। –