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 的所有素数。