作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我写了两个函数来检查一个数字是否在 Haskell 中是质数:
prime :: Int -> Bool
prime 0 = False
prime 1 = False
prime 2 = True
prime n | even n = False
prime n = all (\x -> n `rem` x /= 0) [3,5..intSqrt]
where intSqrt = (floor . sqrt . fromIntegral) n
prime2 :: Int -> Bool
prime2 0 = False
prime2 1 = False
prime2 n = all (\x -> n `rem` x /= 0) [2..intSqrt]
where intSqrt = (floor . sqrt . fromIntegral) n
$ ghc -O2 prime.hs
[1 of 1] Compiling Main ( prime.hs, prime.o )
Linking prime ...
$ time ./prime
142913828922
real 0m4.617s
user 0m4.572s
sys 0m0.040s
$ ghc -O2 prime.hs
[1 of 1] Compiling Main ( prime.hs, prime.o )
Linking prime ...
$ time ./prime
142913828922
real 0m2.288s
user 0m2.268s
sys 0m0.020s
$
main
中的代码很简单:
main :: IO()
main = print $ sum $ filter prime2 [1..2000000]
最佳答案
正如丹尼尔在评论中指出的,询问 even n
会做一个 mod
操作就像在第二个版本中一样。此外,这将是第二个版本中的第一个案例。所以第二个版本的 case 分支较少,但效率相同。记住 Haskell 是一种非严格的语言,所以所有其他的 mod
如果第一个已经返回 True
,则不会强制操作.
关于performance - 在 Haskell 中,看似优化的素性检查更改结果是悲观化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32458484/
我是一名优秀的程序员,十分优秀!