के आलसी मूल्यांकन व्यवहार को समझने में मदद की ज़रूरत है मैंने निक्सन समस्या के दो संस्करण लिखे हैं और मुझे लगता है कि उनके पास समान दक्षता होनी चाहिए लेकिन ऐसा नहीं है। मुझे लगता है कि यह हास्केल के आलसी मूल्यांकन व्यवहार के कारण है। कृपया कोई व्याख्या कर सकते हैं कि यह कैसे निम्न उदाहरण के लिए काम करता है,हास्केल
nqueens1 n 1 = [[i] | i <- [1..n]]
nqueens1 n k = [ i:q | i <- [1..n], q <- (nqueens1 n (k - 1)), isSafe i q k]
isSafe i q n = isSafeHelper i (zip q [(n-1),(n-2)..1])
where isSafeHelper i [] = True
isSafeHelper i (x:xs) = (i /= fst x) && abs(i - (fst x)) /= abs(n - (snd x)) &&
isSafeHelper i xs
nqueens2 n 1 = [[i] | i <- [1..n]]
nqueens2 n k = [ i:q | i <- [1..n], q <- boards, isSafe i q k]
where boards = nqueens2 n (k-1)
आप उन्हें मूल्यांकन कर सकते हैं nqueens1 8 8 या nqueens2 8 8 बुला आकार 8.
के एक बोर्ड के लिए यह मूल्यांकन करने के लिए एक ओर जहां nqueens2 काफी काम करता है के द्वारा कुशलता से nqueens1 प्रदर्शन मुद्दों है। मुझे विश्वास है कि ऐसा इसलिए है क्योंकि रिकर्सिव कॉल (nqueens n (k-1)) का मूल्यांकन कई बार किया जा रहा है। हास्कल्स आलसी मूल्यांकन की मेरी समझ से यह मामला नहीं होना चाहिए।
कृपया इस व्यवहार को समझने में मेरी मदद करें।
अग्रिम धन्यवाद।
"लेज़ी मूल्यांकन" बातें देर से मूल्यांकन के बारे में है - नहीं के मूल्यांकन में कई बार कुछ से बचने के बारे। –
@DanielWagner असल में आलसी मूल्यांकन और कॉल-बाय-नाम के बीच का अंतर बिल्कुल सही है कि कॉल-बाय-नाम का उपयोग करके कई बार मूल्यांकन किए जाने वाले कुछ अभिव्यक्तियों का मूल्यांकन केवल आलसी मूल्यांकन का उपयोग करके किया जाता है। हालांकि यह समस्या से संबंधित नहीं है। – sepp2k
@ sepp2k आप सही हैं, मुझे "आलसी मूल्यांकन" के बजाय "कॉल-बाय-नाम" या "कई बार मूल्यांकन करने से बचने" के बजाय "यादगार" कहकर अधिक सटीक होना चाहिए था। –