Здравствуйте, Kirikaza, Вы писали:
K>Здравствуйте, Alex912, Вы писали:
divisors num = filter (\i -> (mod num i) == 0 ) [1..num]
-- isPrime num = length (divisors num) == 2
isPrime num = (divisors num) == [1,num]
firstPrimes count = take count (filter isPrime [1..])
count = 5000
main = print $ sum ( firstPrimes count :: [Int])
Этот код не соответствует коду на С. Дело в ленивости при вычислении выражения "(divisors num) == [1,num]".
Здесь divisors вычисляется лениво. Сначала вычисляется первый элемент divisors и сравнивается с единицей. Затем вычисляется второй элемент и сравнивается с num. И если второй элемент будет не равен num, то списки будут признаны не равными. Именно это происходит, если num — составное число (не простое).
Т.е. для простых чисел divisors проверяет все делители, а для составных чисел divisors будет работать до первого попавшегося делителя отличного от единицы, и другие делители искать не будет. А вот код на С всегда просматривает все возможные делители. Поэтому С получился медленнее.
... << RSDN@Home (RF) 1.2.0 alpha 5 rev. 17>>