haskell,计算列表中有多少素数

时间:2011-04-13 14:03:34

标签: list function haskell primes

我是haskell的新手,目前我需要一个函数'f',给定两个整数,返回它们之间的素数个数(即大于第一个整数但小于第二个整数)。

Main>  f 2 4
1
Main> f 2 10
3

到目前为止,这是我的代码,但它起作用了。有什么建议?感谢..

f :: Int -> Int -> Int
f x y 
  | x < y = length [ n | n <- [x..y], y 'mod' n == 0] 
  | otherwise = 0

3 个答案:

答案 0 :(得分:6)

  • 从您的示例来看,您需要在开放时间间隔(xy)中的素数数量,在Haskell中将其表示为[x+1 .. y-1]
  • 你的素性测试是有缺陷的;您正在测试y
  • 的因素
  • 要使用函数名作为中缀运算符,请使用反引号(`),而不是单引号(')。

请改为尝试:

-- note: no need for the otherwise, since [x..y] == [] if x>y
nPrimes a b  =  length $ filter isPrime [a+1 .. b-1]

为读者练习:实施isPrime。请注意,它只需要一个参数。

答案 1 :(得分:2)

查看列表理解的作用。

n <- [x..y]

xy的列表中绘制n。

y `mod` n == 0

只选择那些均匀划分y的n

length (...)

查找有多少此类n

您的代码目前所做的是找出x和y(包括)之间的数字是y的因子。因此,如果您执行f 2 4,则列表将为[2, 4](均数为4的数字),且长度为2.如果执行f 2 10,列表将为` [2,5,10](均数除以10的数字),长度为3。

尝试自己了解为什么您的代码不起作用非常重要。在这种情况下,它只是错误的算法。对于查找数字是否为素数的算法,在许多其他来源中,您可以查看wikipedia article: Primality test

答案 2 :(得分:0)

我想要大间隔工作,那么计算一次素数列表可能是个更好的主意(而不是对每个数字进行isPrime测试):

primes = -- A list with all prime numbers
candidates = [a+1 .. b-1]
myprimes = intersectSortedLists candidates primes
nPrimes = length $ myprimes