我已经找到了让代码编译的修改,但它实际上并没有找到素数。我不得不改变
fromInteger (`sqrt` number)
至
floor $ sqrt $ fromIntegral number
函数名周围的反引号是将其转换为各种中缀“运算符”,因此您可以这样做
mod x y
或者
x `mod` y
但不是
`mod` x y
接下来,您使用fromInteger
了而不是s fromIntegral
,它适用于Int
s (Int
并且Integer
是不同的类型)。最后,我删除了的第二个守卫中的floor
from ,因为它已经是一个.number
checkDiv
number
Int
isPrime :: Int -> Bool
isPrime number
| (number == 1) || (number == 2) = True
| even number = False
| otherwise = checkDiv number (floor $ sqrt $ fromIntegral number)
checkDiv :: Int -> Int -> Bool
checkDiv number divisor
| number == 2 = True
| (number `mod` divisor) == 0 = False
| otherwise = checkDiv number $ divisor - 1
因此,让我们检查您的代码,以便您了解发生了什么。如果我要计算checkDiv 17 4
( 4
is floor $ sqrt $ fromIntegral 17
),它将执行
checkDiv 17 4
| 17 == 2 No
| 17 `mod` 4 == 0 No
| otherwise = checkDiv 17 (4 - 1) = checkDiv 17 3
checkDiv 17 3
| 17 == 2 No
| 17 `mod` 3 == 0 No
| otherwise = checkDiv 17 (3 - 1) = checkDiv 17 2
checkDiv 17 2
| 17 == 2 No
| 17 `mod` 2 == 0 No
| otherwise = checkDiv 17 (2 - 1) = checkDiv 17 1
checkDiv 17 1
| 17 == 2 No
| 17 `mod` 1 == 0 Yes = False
不过17
是素数!你看到你的算法在哪里做错了吗?