LINUX.ORG.RU

GHC, fibonacci, почему так медленно?


0

0

subj. Простой, наивный алгоритм:

fib 0 = 0 fib 1 = 1 fib n = fib (n - 2) + fib (n - 1)

Если я правильно понимаю, в чистом функциональном языке он должен работать быстро, но даже fib 100 я не дождался. В чем подвох?

anonymous

Извиняюсь:

fib 0 = 0 fib 1 = 1 fib n = fib (n - 2) + fib (n - 1)

anonymous
()

Еще разок:

fib 0 = 0
fib 1 = 1
fib n = fib (n - 2) + fib (n - 1)

anonymous
()

Нет, оно не должно быстро работать. Это самый простой и медленный способ вычислять числа Фибоначчи.

stassats ★★★★
()

Он везде будет работать медленно, потому что для каждого члена нужно вычислить два предыдущих - а для них еще два, и еще два...
При этом уже вычисленные значения не сохраняются, а вычисляются заново - оттуда тормоза.
Самый быстрый вариант из всех, что я видел:

fibs  = 0:1:zipWith (+) fibs (tail fibs)
fib n = fibs !! n

В этом случае значения вычисляются только один раз (наверное:)).
fib 100 вычисляется мгновенно.

rexadecimal
()
Ответ на: комментарий от Davidov

эта форма хороша для теоретических оценок, но считать ее ты в флоатах будешь?

Самая лучший способ вычисления фибоначей, это:

[ 0 1 ]^N * [ 1 ] 
[ 1 1 ]     [ 1 ]

dilmah ★★★★★
()

>в чистом функциональном языке он должен работать быстро

а какое отношение к скорости выполнения этого алгоритма имеет чистота языка ? или его функциональность ?

jtootf ★★★★★
()
Ответ на: комментарий от anonymous

> Ну какбе оптимизация хвостовой рекурсии бла-бла...

здесь нужна мемоизация

dilmah ★★★★★
()
Ответ на: комментарий от imp

> А где тут хвостовая рекурсия?

Ну, а она разве обычная рекурсия не должна авотматически оптимизироваться?

anonymous
()
Ответ на: комментарий от anonymous

обычную превращать в хвостовую? Нет.

imp ★★
()
Ответ на: комментарий от anonymous

> Ну, а она разве обычная рекурсия не должна авотматически оптимизироваться?

даже когда хвостовая рекурсия оптимизируется, то это только означает нерасход этой рекурсией памяти. Количество вызовов остается тем же. В данном случае идет экспоненциальное кол-во вызовов, и в этом проблема. Тут нужна такая оптимизация, которая запоминает результат уже отработавших вызовов.

dilmah ★★★★★
()
Ответ на: комментарий от dilmah

>В данном случае...и в этом проблема

в данном случае проблема не в компиляторе, а в ДНК. впрочем, это моё личное мнение

jtootf ★★★★★
()

Дожили. Уже в хаскель быдлокодеры пошли.

Miguel ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.