开发者

haskell, counting how many prime numbers are there in a list

i m a newbie to haskell, currently i need a function 'f' which, given two integers, returns the number of prime numbers in between them (i.e., greater than the first integer but smaller than the second).

Main>  f 2 4
1
Main> 开发者_运维技巧f 2 10
3

here is my code so far, but it dosent work. any suggestions? thanks..

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


  • Judging from your example, you want the number of primes in the open interval (x,y), which in Haskell is denoted [x+1 .. y-1].
  • Your primality testing is flawed; you're testing for factors of y.
  • To use a function name as an infix operator, use backticks (`), not single quotes (').

Try this instead:

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

Exercise for the reader: implement isPrime. Note that it only takes one argument.


Look at what your list comprehension does.

n <- [x..y]

Draw n from a list ranging from x to y.

y `mod` n == 0

Only select those n which evenly divide y.

length (...)

Find how many such n there are.

What your code currently does is find out how many of the numbers between x and y (inclusive) are factors of y. So if you do f 2 4, the list will be [2, 4] (the numbers that evenly divide 4), and the length of that is 2. If you do f 2 10, the list will be `[2, 5, 10] (the numbers that evenly divide 10), and the length of that is 3.

It is important to try to understand for yourself why your code doesn't work. In this case, it's simply the wrong algorithm. For algorithms that find whether a number is prime, among many other sources, you can check the wikipedia article: Primality test.


I you want to work with large intervals, then it might be a better idea to compute a list of primes once (instead of doing a isPrime test for every number):

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

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜