Haskell:素数检测器

时间:2013-10-06 01:06:11

标签: haskell recursion

我正在尝试学习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

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