我正在尝试学习Haskell而且我遇到了递归问题。我需要做的是找到一个数字是否为素数。这是我到目前为止的尝试。但它不起作用。它为非素数给出“假”,但当数字为素数时,它会陷入无限循环。
isPrime :: Int -> Bool
isPrime num = primeTest num 2
where
primeTest :: Int -> Int -> Bool
primeTest num x
| x == num = True
| num `mod` x == 0 = False
| otherwise = primeTest num (x + 1)
where
x = 2
答案 0 :(得分:3)
你不需要
where
x = 2
这就是它遇到无限循环的原因。例如,考虑输入2,num mod x
将返回0,因此它将返回False。考虑输入5,num mod x
将返回1(因为x
在这种情况下为1)。因此,它转到了其他部分,其中primeTest num (x + 1)
通过分配x = 2
来调用。因此,此循环将始终无限运行,x
值为3。
答案 1 :(得分:1)
最后的where x=2
会导致x
之后primeTest num x
的每个实例都为2,无论primeTest
中传递给x
的值是多少}“插槽。”摆脱where x=2
。