使用遞迴判斷給定數字是否為素數的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 到要檢查的數字的平方根的所有數字,並檢查該數字是否可以被其中的任何一個整除。如果該數字不能被這些數字中的任何一個整除,則它是一個素數。這也可以使用遞迴來檢查。

更新於: 2023年3月27日

1K+ 瀏覽量

開啟你的 職業生涯

透過完成課程獲得認證

開始學習
廣告

© . All rights reserved.