2013-10-06 54 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