Обычная рекурсивная реализация Фибоначчи O (N) больше похожа на это:
def fib(n, a=0, b=1):
if n == 0: return a
if n == 1: return b
return fib(n - 1, b, a + b)
Преимущество этого подхода (помимо того факта, что он использует память O (1)) состоит в том, что это хвост -recursive: некоторые компиляторы и / или среды выполнения могут воспользоваться этим, чтобы тайно преобразовать его в простую инструкцию JUMP. Это называется оптимизацией хвостового вызова.
Python, к сожалению, не использует эту стратегию, поэтому он будет использовать дополнительную память для стека вызовов, который, как вы заметили, быстро переходит в Python предел глубины рекурсии.
Последовательность Фибоначчи - в основном игрушечная задача, используемая для обучения людей написанию алгоритмов и большой нотации Oh. Он имеет элегантные функциональные решения, а также демонстрирует сильные стороны динамического c программирования (в основном ваше решение на основе словаря), но это также практически решенная проблема.
Мы также можем go намного быстрее. На странице https://www.nayuki.io/page/fast-fibonacci-algorithms описано, как это сделать. Он включает в себя алгоритм быстрого удвоения, написанный на Python, который я хотел бы включить сюда, но, к сожалению, лицензия не позволяет мне это сделать.