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 编程语言中实现一个程序来检查输入数字是否为素数。

更新于: 2022-12-14

353 次浏览

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告