0

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

2 回答 2

3

你不需要

where 
  x = 2

这就是它陷入无限循环的原因。例如,考虑输入 2,num mod x将返回 0,因此将返回 False。考虑输入 5,num mod x将返回 1(因为x在这种情况下为 1)。所以,它转到了其他部分,primeTest num (x + 1)用 assigning 调用x = 2。所以,这个循环总是会无限运行,x值为 3。

于 2013-10-06T01:10:55.090 回答
1

无论在“插槽”中传递的值是什么,最后where x=2都会导致xafter的每个实例为 2。摆脱.primeTest num xprimeTestxwhere x=2

于 2013-10-06T01:11:11.547 回答