haskell, считая, сколько простых чисел есть в списке - PullRequest
3 голосов
/ 13 апреля 2011

Я новичок в 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 ]

6 голосов
/ 13 апреля 2011
  • Судя по вашему примеру, вам нужно количество простых чисел в открытом интервале (x, y), которое в Хаскеле обозначается как [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.Обратите внимание, что он принимает только один аргумент.

2 голосов
/ 13 апреля 2011

Посмотрите, что делает ваше понимание списка.

n <- [x..y]

Нарисуйте n из списка в диапазоне от x до y.

y `mod` n == 0

Выберите только те n, которые равномерно делят y.

length (...)

Найдите, сколько таких n.

То, что ваш код в настоящее время делает, это выясняет, сколько чисел между x и y (включительно) являются факторами y. Поэтому, если вы сделаете f 2 4, список будет [2, 4] (числа, которые равномерно делят 4), а длина равна 2. Если вы сделаете f 2 10, список будет `[2, 5, 10 ] (числа, которые равномерно делят 10), а длина равна 3.

Важно попытаться понять для себя , почему ваш код не работает. В этом случае это просто неправильный алгоритм. Для алгоритмов, которые находят, является ли число простым, среди многих других источников, вы можете проверить статью в Википедии: Проверка на примитивность .

0 голосов
/ 14 апреля 2011

Если вы хотите работать с большими интервалами, то, возможно, будет лучше вычислить список простых чисел один раз (вместо того, чтобы делать тест isPrime для каждого числа):

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