使用遞迴判斷給定數字是否為素數的Haskell程式
在 Haskell 中,我們可以使用遞迴和輔助函式來判斷給定數字是否為素數。在第一個示例中,我們將使用 (isPrime n | n <= 1 = False | n == 2 = True | otherwise = isPrimeHelper n 2) 函式,在第二個示例中,我們將使用 (isPrime n = isPrimeHelper n 2) 函式,在第三個示例中,我們將使用 (isPrime n = isPrimeHelper n 2 (floor . sqrt . fromIntegral $ n)) 函式。
演算法
步驟 1 − 使用輔助函式定義使用者自定義的 isPrime 函式,其定義如下:
isPrime n | n <= 1 = False | n == 2 = True | otherwise = isPrimeHelper n 2 .
步驟 2 − 定義使用者自定義的輔助函式:
isPrimeHelper n d | d > (n `div` 2) = True | n `mod` d == 0 = False | otherwise = isPrimeHelper n (d + 1).
步驟 3 − 程式執行將從主函式開始。main() 函式控制整個程式,其定義為 main = do。在主函式中,將呼叫使用者自定義的遞迴函式並傳遞引數。
步驟 4 − 初始化名為“num”的變數。它將儲存要檢查的數字,以確定其是否為素數。
步驟 5 − 函式呼叫完成後,使用‘show’函式將數字是否為素數的結果列印到控制檯。
示例 1
在這個示例中,使用了兩個函式 isPrime 和 isPrimeHelper 來檢查一個數字是否為素數。isPrime 函式充當包裝器,它使用 n 作為第一個引數和 2 作為第二個引數來呼叫 isPrimeHelper。
isPrime :: Integer -> Bool
isPrime n
| n <= 1 = False
| n == 2 = True
| otherwise = isPrimeHelper n 2
isPrimeHelper :: Integer -> Integer -> Bool
isPrimeHelper n d
| d > (n `div` 2) = True
| n `mod` d == 0 = False
| otherwise = isPrimeHelper n (d + 1)
main :: IO ()
main = do
let num = 7
let isPrimeNum = isPrime num
if isPrimeNum
then putStrLn (show num ++ " is a prime number.")
else putStrLn (show num ++ " is not a prime number.")
輸出
7 is a prime number.
示例 2
在這個示例中,使用了兩個函式 isPrime 和 isPrimeHelper 來檢查一個數字是否為素數。isPrime 函式使用 n 作為第一個引數和 2 作為第二個引數來呼叫 isPrimeHelper。
isPrime :: Integer -> Bool
isPrime n = isPrimeHelper n 2
isPrimeHelper :: Integer -> Integer -> Bool
isPrimeHelper n d
| n < 2 = False
| d == n = True
| n `mod` d == 0 = False
| otherwise = isPrimeHelper n (d + 1)
main :: IO ()
main = do
let num = 7
let isPrimeNum = isPrime num
if isPrimeNum
then putStrLn (show num ++ " is a prime number.")
else putStrLn (show num ++ " is not a prime number.")
輸出
7 is a prime number.
示例 3
在這個示例中,使用了兩個函式 isPrime 和 isPrimeHelper 來檢查一個數字是否為素數。isPrime 函式使用 n 作為第一個引數,2 作為第二個引數,以及 n 的平方根作為第三個引數來呼叫 isPrimeHelper。
isPrime :: Integer -> Bool
isPrime n = isPrimeHelper n 2 (floor . sqrt . fromIntegral $ n)
isPrimeHelper :: Integer -> Integer -> Integer -> Bool
isPrimeHelper n d sqrtN
| n < 2 = False
| d > sqrtN = True
| n `mod` d == 0 = False
| otherwise = isPrimeHelper n (d + 1) sqrtN
main :: IO ()
main = do
let num = 7
let isPrimeNum = isPrime num
if isPrimeNum
then putStrLn (show num ++ " is a prime number.")
else putStrLn (show num ++ " is not a prime number.")
輸出
7 is a prime number.
結論
在 Haskell 中,可以使用多種演算法來檢查素數,包括試除法、埃拉托色尼篩法和費馬小定理。要檢查一個數字是否為素數,可以編寫一個函式,該函式迭代從 2 到要檢查的數字的平方根的所有數字,並檢查該數字是否可以被其中的任何一個整除。如果該數字不能被這些數字中的任何一個整除,則它是一個素數。這也可以使用遞迴來檢查。
資料結構
網路
RDBMS
作業系統
Java
iOS
HTML
CSS
Android
Python
C語言程式設計
C++
C#
MongoDB
MySQL
Javascript
PHP