使用递归判断给定数字是否为素数的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 到要检查的数字的平方根的所有数字,并检查该数字是否可以被其中的任何一个整除。如果该数字不能被这些数字中的任何一个整除,则它是一个素数。这也可以使用递归来检查。