我已經想通了修改,以獲得代碼編譯,但它實際上並沒有找到素數。我不得不改變
fromInteger (`sqrt` number)
到
floor $ sqrt $ fromIntegral number
圍繞一個函數名的反引號標記是將其送到各種各樣的綴「經營者」,所以你可以做
mod x y
或
x `mod` y
但不是
`mod` x y
接下來,您使用fromInteger
代替fromIntegral
,這是對Int
S(Int
和Integer
是不同的類型)的作品之一。最後,我從number
中刪除floor
,第二個後衛checkDiv
,因爲number
已經是Int
。
isPrime :: Int -> Bool
isPrime number
| (number == 1) || (number == 2) = True
| even number = False
| otherwise = checkDiv number (floor $ sqrt $ fromIntegral number)
checkDiv :: Int -> Int -> Bool
checkDiv number divisor
| number == 2 = True
| (number `mod` divisor) == 0 = False
| otherwise = checkDiv number $ divisor - 1
因此,讓我們通過您的代碼,以便您可以看到發生了什麼。如果我計算checkDiv 17 4
(4
是floor $ sqrt $ fromIntegral 17
),它會執行
checkDiv 17 4
| 17 == 2 No
| 17 `mod` 4 == 0 No
| otherwise = checkDiv 17 (4 - 1) = checkDiv 17 3
checkDiv 17 3
| 17 == 2 No
| 17 `mod` 3 == 0 No
| otherwise = checkDiv 17 (3 - 1) = checkDiv 17 2
checkDiv 17 2
| 17 == 2 No
| 17 `mod` 2 == 0 No
| otherwise = checkDiv 17 (2 - 1) = checkDiv 17 1
checkDiv 17 1
| 17 == 2 No
| 17 `mod` 1 == 0 Yes = False
但17
是黃金!你看到你的算法在做錯什麼嗎?
你想解決這個問題? – bheklilr
你爲什麼要把'sqrt'加入反引號?只需使用'(sqrt number)'。 –
如果number是一個素數,isPrime數字應該爲真,如果不是則爲false,但我想使用這個算法 – msietrterc