2013-10-06 56 views
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 

回答

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

+0

非常感谢。显而易见的时候,我很头疼,试图查明什么是错的。我真的很喜欢它! –

+1

@ user2850788不客气。请考虑upvoting和接受这个答案,如果它可以帮助你。 http://meta.stackexchange.com/a/5235/235416 – thefourtheye

1

where x=2末引起x每个实例primeTest num x之后是2,无论传递给primeTestx“插槽的价值。 “摆脱where x=2