Я учусь Haskell, и я написал простую функцию Фибоначчи:Haskell Фибоначчи кажется медленным
fib :: Int -> Int
fib 1 = 1
fib 0 = 0
fib n = (fib (n-1)) + (fib (n-2))
Кажется, компилировать нормально, и загрузку этого сценария в GHCI РЕПЛ я мог возиться с несколькими номерами , Я попытался
fib 33
и был удивлен, что она занимает около 4 секунд, чтобы дать результат. (Извините, я не знаю, как еще раз выполнить функцию в Haskell, так что считал себя).
Fib 33 не особо облагается налогом. Ответ составляет менее 4 миллионов. Итак, я предполагаю, что мой код не очень хорошо написан или есть некоторые проблемы с тем, как я делаю рекурсию (ну, это не так хорошо написано, что она не учитывает отрицательные целые числа). Вопрос в том, почему он медленный? Любая помощь приветствуется.
Этот вопрос кажется хорошей для Просмотра Кода. – Alexander
Когда вы смотрите на свой код, представьте себе, как часто вычисляется 'fib (5)'. На каждой итерации вы снова вычисляете все «внутренние» числа фибоначчи. – WeSt
Вы должны использовать классическую ленивую версию бесконечного списка: 'fibs = 0: 1: zipWith (+) fibs (tail fibs)' с 'fib n = fibs !! n'. См. [Вики о haskell о последовательности Фибоначчи] (https://www.haskell.org/haskellwiki/The_Fibonacci_sequence).Забавно, что Фибоначчи славится этой последовательностью, которая была всего лишь небольшим упражнением в книге, в которой он должен быть знаменит, что ввело ценность для Западной Европы. – AndrewC