Re[3]: Почему на Haskell получается так быстро?!
От: Буравчик Россия  
Дата: 22.12.11 19:42
Оценка: 7 (1)
Здравствуйте, 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>>
Best regards, Буравчик
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.