Haskell 程序用于显示 1 到 n 之间的所有素数


本教程将讨论编写一个程序,以在 Haskell 编程语言中显示从 1 到 N 的所有素数。Haskell 是一种声明式、强类型和函数式语言。Haskell 中的计算是数学函数。

素数必须有两个正因子:1 和它本身。

示例 2,3,5,7,..

注意 1 不是素数,因为它只有一个因子。

算法步骤

  • 实现一个函数来检查一个数是否为素数。

  • 实现一个函数来生成一个范围内所有素数。

  • 显示素数。

  • 程序:显示 1 到 N 之间的所有素数

  • 我们将程序分解成更简单的函数。

语法

函数:查找一个数的所有因子。

–- function declaration
factors :: Int->[Int]
–- function definition
factors n = [x | x<-[1..n], (mod n x)==0]

上述函数是一个实用函数,用于检查一个数是否为素数。我们声明了一个名为 factor 的函数,它接受一个整数作为输入并返回一个整数列表。在函数中,我们使用列表推导式生成从 1 到 n(参数)的数字,并返回能整除参数 n 的数字,即列表推导式生成参数 n 的所有因子并将其作为列表返回。

Ex: output for factors 50 is:
[1,2,5,10,25,50]
Function to check a number is prime
-- function declaration
isPrime :: Int->Bool
-- function definition
isPrime n = (factors n) == [1,n]

上述函数是一个实用函数,用于在给定范围内生成素数。我们声明了一个名为 isPrime 的函数,它接受一个整数作为输入并返回一个布尔值。在函数定义中,我们使用参数作为第一个参数调用 factors 函数,并将返回的列表与包含两个数字(1 和参数)的列表进行比较,即此函数检查一个数的因子是否等于 1 和该数本身,这是素数的定义,如果该数是素数则返回真,否则返回假。

Ex: Output for isPrime 13 is:
True

函数:以迭代方式生成 1 到 N 的素数

-- function declaration
generatePrime :: Int->[Int]
-- function definition
generatePrime n = [x | x<-[1..n], isPrime x]

上述函数生成 1 到 N 的所有素数。我们声明了一个名为 generatePrime 的函数,它接受一个整数作为参数并返回一个整数列表。在函数定义中,我们使用列表推导式生成从 1 到 n 的整数列表,并使用 isPrime 函数对其进行过滤,该函数仅返回为素数的数字。

Ex: output for generatePrime 50 is:
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47]

函数:以递归方式生成 1 到 N 的素数

-- function declaration
generatePrime2 :: Int->[Int]
-- function definition

-- base case
generatePrime2 0 = []

generatePrime2 n = if (isPrime n)
then generatePrime2 (n-1) ++ [n]
else generatePrime2 (n-1)

上述函数 generatePrime2 以递归方式生成 1 到 N 的所有素数。我们声明了该函数,它接受一个整数作为输入并返回一个整数列表。在函数定义中,我们接受一个整数 n 作为参数,并检查它是否为素数。如果 n 是素数,我们将 n 与使用参数 n-1 进行递归调用的结果连接起来。如果 n 不是素数,我们将返回使用参数 n-1 进行递归调用。这将持续进行,直到达到基本情况,即当 n 达到 0 时,函数返回一个空列表。这以递归方式检查从 n 到 0 的素数。

Example: Output for generatePrime 60 is:
[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59]

整体程序

factors :: Int->[Int] factors n = [x | x<-[1..n], (mod n x)==0] isPrime :: Int->Bool isPrime n = (factors n) == [1,n] generatePrime :: Int->[Int] generatePrime n = [x | x<-[1..n], isPrime x] main = do let n = 100 print (generatePrime n)

输出

[2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97]

在上述程序中,我们组合了所有实用函数以在给定范围内生成素数。在主函数中,我们声明并初始化了数字 n 的值为 100,并调用了 generatePrime 函数,该函数生成从 1 到 N 的所有素数。最后,我们打印了被调用函数返回的列表。

结论

在本教程中,我们讨论了编写一个程序以在 Haskekell 编程语言中显示从 1 到 N 的所有素数。

更新于: 2022年10月27日

2K+ 次查看

开启你的 职业生涯

通过完成课程获得认证

立即开始
广告