tembel değerlendirme davranışını anlamada yardıma ihtiyacım var Nqueens probleminin iki versiyonunu yazdım ve benzer bir verimliliğe sahip olduklarını düşünüyorum ama öyle değil. Bunun, Haskell'in tembel değerlendirme davranışından kaynaklandığını düşünüyorum. Aşağıdaki örnek nasıl çalıştığını kimse oldukça çalışır nqueens2 iken boyutu 8.Haskell
bir yönetim kurulu için değerlendirmek nqueens1 8 8 veya 8 8 nqueens2 arayarak
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)
Bunları değerlendirebilir, lütfen açıklayabilir verimli nqueens1 performans sorunları var. Bunun, yinelemeli çağrının (nqueens n (k-1)) birden çok kez değerlendirilmekte olduğuna inanıyorum. Haskells tembel değerlendirme anlayışından bu durum böyle olmamalı.
Lütfen bu davranışı anlama konusunda bana yardımcı olun.
Şimdiden teşekkürler.
"Tembel değerlendirme" geç şeyler değerlendirilmesi hakkındadır - değil değerlendirerek şey defalarca kaçınma hakkında. –
@DanielWagner Aslında, tembel değerlendirme ve isim-arama arasındaki fark, tam olarak, isim-arama kullanılarak bir kez daha değerlendirilecek olan belirli ifadelerin, yalnızca tembel değerlendirme kullanılarak bir kez değerlendirildiğidir. Buradaki problemle alakalı değil. – sepp2k
@ sepp2k Haklıyım, ya "tembel değerlendirme" yerine "isimsiz arama" diyerek ya da "pek çok şeyi değerlendirmekten kaçınmak" yerine "hatırlatma" diyerek daha hassas olmalıydım. –