我是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
答案 0 :(得分:6)
x
,y
)中的素数数量,在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]
从x
到y
的列表中绘制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