Haskell 程序用于检查输入数字是否为素数
本教程讨论了编写一个程序,以检查输入数字在 Haskell 编程语言中是否为素数。Haskell 是一种声明式、强类型和函数式编程语言。Haskell 中的计算是数学函数。
素数是指只有 1 和自身两个因数的数。注意 1 既不是素数也不是合数,因为它只有一个因数。例如,3 是一个素数,因为它只有两个因数 1 和 3 本身。
在本教程中,我们将看到:
- 使用递归函数检查数字是否为素数的程序。
- 使用列表推导式检查数字是否为素数的程序。
示例 1
使用递归函数检查数字是否为素数的程序
-- function declaration isPrime :: Int->Int->Bool -- function definition -- base case isPrime 1 i = False isPrime n i = if(i==n) then True else if ((mod n i) == 0) then False else isPrime n (i+1) main :: IO() main = do -- declare and initialize variables let n = 23 -- invoking the function isPrime let status = isPrime n 2 -- print the status if (status==True) then print ("The number " ++ show n ++ " is a prime number") else print ("The number " ++ show n ++ " is not a prime number")
输出
"The number 23 is a prime number"
在上述程序中:
我们声明了一个名为 isPrime 的函数,它接受两个整数参数并返回一个布尔值。在其函数定义中,它接受两个整数参数 n 和 i,其中 n 是要计算素数状态的数字,i 是用于递归的迭代变量。
该函数将 n 的值与 i 的值进行比较。如果 n 的值等于 i,则控制权转移到 then 代码块,该代码块返回 False 值。
如果 n 的值不等于 i,则控制权转移到 else 代码块,该代码块检查数字 n 是否能被 i 整除。如果 n 能被 i 整除,则函数返回 false,即数字 n 在 1 和 n 之间有一个除数,因此返回 false。如果 n 不能被 i 整除,则函数使用参数 n 和 (i+1) 对自身进行递归调用。
递归调用会一直执行,直到迭代变量 I 达到 n 的值,表示该数字是素数。该函数的基本情况定义为:如果 n 的值为 1,则函数返回 False,因为 1 既不是素数也不是合数。
在主函数中,为 n 初始化了一个变量,并使用参数 n 和 1 调用 isPrime 函数,其中第二个参数是用于递归的迭代值。返回的输出加载到变量 status 中。最后,检查 status 的值,如果 status 的值为 true,则程序打印“该数字是素数”,否则程序打印“该数字不是素数”。
注意 - show 函数接受一个数字作为参数,并返回该数字的解析字符串。“++”是 Haskell 中用于连接字符串的操作符。
示例 2
使用列表推导式检查数字是否为素数的程序
-- function declaration isPrime :: Int->Bool -- function definition -- base case isPrime 1 = False isPrime n = and [(mod n i)/=0 | i<-[2..(n-1)]] main :: IO() main = do -- declare and initialize variables let n = 23 -- invoking the function isPrime let status = isPrime n -- print the status if (status==True) then print ("The number " ++ show n ++ " is a prime number") else print ("The number " ++ show n ++ " is not a prime number")
输出
"The number 23 is a prime number"
在上述程序中:
我们声明了一个名为 isPrime 的函数,它接受一个整数作为参数并返回一个布尔值。在其函数定义中,该函数接受一个参数 n,其中 n 是要检查素数状态的数字。在函数中,通过生成从 2 到 n-1 的数字并通过将数字 n 除以 i 并将计算结果与 0 进行比较来返回数字作为布尔值,从而生成一个布尔值列表。
列表推导式生成一个布尔值列表,表示 1 和 n-1 之间的数字。如果数字可以被 i 整除,则相应的布尔值为 False,否则相应的布尔值为 True。
我们调用了一个函数,该函数接受一个布尔值列表作为参数,并返回列表中所有布尔值的累积操作。
如果列表中的所有值都为 true,则此函数返回 true,即数字在 1 和 n 之间没有除数。得出结论,该数字是一个素数。否则,如果列表中的任何值为 False,则该函数返回 true,即数字在 1 和 n 之间的范围内有一个除数。
该函数的基本情况定义为:如果 n 的值为 1,则函数返回 False,因为 1 既不是素数也不是合数。
在主函数中,为 n 初始化了一个变量,并使用参数 n 调用 isPrime 函数。返回的输出加载到变量 status 中。最后,检查 status 的值,如果 status 的值为 true,则程序打印“该数字是素数”,否则程序打印“该数字不是素数”。
结论
在本教程中,我们讨论了在 Haskell 编程语言中实现一个程序来检查输入数字是否为素数。