#haskell #fibonacci
#haskell #фибоначчи
Вопрос:
Я запускаю консоль GHCi и набираю
fib 0 = 0
fib 1 = 1
fib n = fib (n-1) fib (n-2)
и затем
fib 5
и консоль зависает и умирает с:
: Не хватает памяти
Что я делаю не так?
Ответ №1:
На консоли вы не определили ни одной функции fib
с тремя разными регистрами; вы сначала определили fib 0 = 0
, затем перезаписали ее новой функцией fib 1 = 1
, затем, наконец, третьей функцией fib n = fib (n-1) fib (n-2)
, у которой нет базового регистра. Вы можете использовать
> fib 0 = 1; fib 1 = 1; fib n = fib (n-1) fib (n-2)
чтобы правильно определить единственную функцию с тремя регистрами.
Обратите внимание, что это в первую очередь проблема, начиная с GHCi 8, поскольку в предыдущих версиях вам пришлось бы использовать let
для запуска определения и вы получили бы ошибку синтаксического анализа во второй строке:
> let fib 0 = 0
> fib 1 = 1
<interactive>:3:7: parse error on input '='
Ответ №2:
При вводе объявлений отдельно в ghci каждое из них читается как отдельное определение fib
, затеняющее своих предшественников. Другими словами, вы эффективно работаете
fib n = fib (n-1) fib (n-2)
fib 5 -- infinite recursion here
Самый простой способ избежать этой проблемы — поместить определение fib
в файл.