使用递归判断给定数字是否为素数的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+ 浏览量

开启你的 职业生涯

通过完成课程获得认证

开始学习
广告