【发布时间】:2012-04-01 15:39:17
【问题描述】:
所以我正在处理Problem 31。
我编写了以下函数,希望确定一个数字是否为素数:
isPrime :: Integer -> Bool
isPrime x = prime x 2
where
prime :: Integer -> Integer -> Bool
prime x y | ((y*y) < x) and ((x `mod` y) /= 0) = prime x (y+1)
| ((y*y) >= x) = True
| otherwise = False
我的逻辑是创建一个 isPrime 函数,并在 isPrime 中有一个名为 prime 的函数来存储 2 个参数,我想检查它是否为素数 (x) 和一个迭代器检查 x 的 sqrt 下面的所有数字,看看它们是否除以x。 prime有3个守卫:
| ((y*y) < x) and ((x `mod` y) == 0) = prime x (y+1)
这条线应该说:是我传递的数字小于 x 的平方根(((y*y) < x)),如果它是检查x 是否可以被y 整除(((xmody) /= 0) ),如果不是,我使用递归并增加 y 以再次检查更大的数字。
这一行:
| ((y*y) >= x) = True
应该是这样的,如果平方根以下的所有数字无论如何都不除 x,x 必须是素数。
最后,这一行:
| otherwise = False
表示沿线某处的数除以 x,因此它不是素数。
我认为我写的代码是有道理的,我知道它不是最有效的,考虑到我可以只检查 sqrt x 以下的素数而不是 sqrt x 以下的所有数字,但无论如何,我对这个语句有疑问:
((y*y) < x)
GHCi 说:
The function `(y * y) < x' is applied to two arguments, but its type `Bool' has none
我认为< 应该接受两个参数并返回一个 Bool,错误消息对我来说并没有什么意义。你能帮我弄清楚我做错了什么吗?谢谢。
现在我可以运行它,快速编辑,这一行:
| ((y*y) >= x) = True
应该是:
| ((y*y) > x) = True
【问题讨论】:
标签: haskell