2011-04-13 55 views
3

ima newbie to haskell,目前我需要一个函数'f',给定两个整数,返回它们之间的素数的个数(即大于第一个整数但小于第二个)。haskell,计算列表中有多少个素数

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

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

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

'主> F 2 4' '2' 这是我的结果,但你知道,在2到4之间,只有1个素数,3!所以结果假设是1而不是2 ... – sefirosu 2011-04-13 14:34:04

+0

我希望范德姆特教授不会决定设置另一个评估,因为你的愚蠢和懒惰,不仅自己做评估,而且甚至改变问题... – 2011-04-14 16:49:29

回答

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。请注意,它只需要一个参数。

+0

好,两个额外的评论:1. [a + 1,b-1]应该是[a + 1 .. b-1]和2。我认为提问者故意没有使用反引号,因为堆栈溢出会以某种相反的方式将它们解释为“像这样”。 – Tarrasch 2011-04-13 14:38:59

+0

@Tarrasch:1.感谢您的纠正; 2.我认为,但反引号在代码块中工作正常,OP显然知道如何使用。 – 2011-04-13 14:53:35

+0

对不起,作为一个noobie ...我真的不明白这是什么意思'nPrimes a b = length $ filter isPrime [a + 1 .. b-1]'它如何适应我的代码? – sefirosu 2011-04-13 15:14:30

2

看看你的列表理解是干什么的。

n <- [x..y] 

抽奖n的范围从xy列表。

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

0

我想要有大的间隔工作,那么它可能是一个更好的主意来计算素数列表一次(而不是做每一个号码的isPrime测试):

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