Yazım isminin fonksiyonu. Verilen bir sayının asal olup olmadığını kontrol eder. Son "ana" liste ayrı ayrı verilir. konsolide edilmiş işlev çok yavaş
prime :: [Integer]
prime = 2 : filter isPrime [3..]
isPrime :: Integer -> Bool
isPrime n | n < 2 = False
isPrime n = all (\p -> n `mod` p /= 0) . takeWhile ((<=n) . (^2)) $ prime
Ben birine iki işlevi pekiştirmek her zaman daha iyi olduğunu düşündüm possible..so Bir fonksiyon isPrime2 içine isPrime ve asal konsolide eğer. Ama isPrime2'nin performansı çok kötü.
isPrime2 :: Integer -> Bool
isPrime2 n | n < 2 = False
isPrime2 n = all (\p -> n `mod` p /= 0) . takeWhile ((<=n) . (^2)) $ 2 : filter isPrime2 [3..]
=> 19.8 saniye
Makinem
isPrime2 40000000000000000001
=> 0.5 saniye isPrime Ubuntu 17.10 X86-64 olup. Ghc 8.2.1 kullanıyorum. Nedenini bilen var mı?
Benim tahminim, 'asal' bir sabit olduğu için, o anılırken, 'isPrime2' bir işlevdir, bu yüzden olmaz. Bu sadece bir tahmin, ancak ... – MathematicalOrchid
Teşekkürler! Açıklaman bana içgörü verdi. – eii0000
@ eii0000 derlediniz mi veya yorumlandı mı test ediyorsunuz? isPrime2 n 'nizi' '('' (\ p -> n' mod' p/= 0) olarak basitleştirirseniz nasıl karşılaştırırsınız. takeWhile ((<= n). (^ 2)) 2 $: [3,5 ..] ''? –