Ниже сравниваются функции, которые вы показали.В общем, эти наблюдения не обязательно верны для любого рекурсивного или итеративного подхода для вычисления чисел Фибоначчи, но только для реализаций, которые вы показали в вопросе.
Сложность времени:
Первый вызов
- Рекурсивный подход: O (n)
- Итерационный подход: O (n)
Последующие вызовы
- Рекурсивный подход: O (1)
- Итеративный подход: O (n)
Постоянные факторы
Постоянные факторы могут быть совершенно разными.Вполне вероятно (первый вызов), что итеративный подход будет быстрее, чем рекурсивный, даже если оба O(n)
.Исходя из моего опыта (не фактических тестов), это всего лишь предположение, что индексирование списков происходит намного быстрее, чем вызов функции.
Сложность памяти:
Оба требуют O (n) дополнительной памяти,однако рекурсивный подход сохранит память (поэтому она будет постоянно выделена), в то время как итерационный подход освободит память после завершения функции.
Другие различия
Предел рекурсии Python.Когда время становится слишком большим, а кэш-память не заполняется, рекурсивный подход завершится неудачей из-за этого ограничения, например fib(500)
.Нет такого ограничения (кроме случаев, когда у вас заканчивается память) для индексации списка.