Climbing Stairs
Лестница состоит из n ступеней. За один шаг можно подняться на 1 или на 2 ступени.
Сколькими различными способами можно подняться наверх?
n ≤ 45.n = 2 output = 2 # 1+1, 2
n = 3 output = 3 # 1+1+1, 1+2, 2+1
Подсказка
Чтобы стоять на ступени i, вы либо пришли с i−1, либо с
i−2. Значит f(i) = f(i−1) + f(i−2) — это почти числа Фибоначчи.
Наивная рекурсия без запоминания даёт экспоненциальное время.
Решение
def climb_stairs(n):
a, b = 1, 1 # f(0), f(1)
for _ in range(n - 1):
a, b = b, a + b
return b
Сложность: время O(n), память O(1).
Тот же рекуррентный шаг — в задачах Codewars N-th Fibonacci и Simple Memoization: там мемоизация нужна явно, иначе наивная рекурсия не укладывается в время.