в псевдо-питоне
def fib(x):
tot = 0
stack = [x]
while stack:
a = stack.pop()
if a in [0,1]:
tot += 1
else:
stack.push(a - 1)
stack.push(a - 2)
return tot
Если вам не нужен внешний счетчик, вам нужно будет нажать кортежи, которые отслеживают накопленную сумму, и было ли это a - 1
или a - 2
.
Вероятно, стоит потратить время на явную запись стека вызовов (вручную, на бумаге) для запуска скажем fib (3) для вашего кода (хотя сначала исправьте ваш код, чтобы он обрабатывал граничные условия),Как только вы это сделаете, должно быть ясно, как это сделать без стека.
Редактировать:
Давайте проанализируем выполнение следующего алгоритма Фибоначчи
def fib(x):
if (x == 0) or (x == 1):
return 1
else:
temp1 = fib(x - 1)
temp2 = fib(x - 2)
return temp1 + temp2
(Да, я знаю, что это даже неэффективная реализация неэффективного алгоритма, я объявил больше временных значений, чем необходимо.)
Теперь, когда мы используем стек для вызова функций, нам нужно хранить в стеке два вида вещей.
- Где вернуть результат.
- Пробел для локальных переменных.
В нашем случае у нас есть три возможных места для возврата.
- Некоторые внешние абоненты
- Назначить для temp1
- Назначить для temp2
нам также нужно место для трех локальных переменных x, temp1 и temp2.давайте рассмотрим fib (3)
, когда мы первоначально вызываем fib, мы сообщаем стеку, что мы хотим вернуться туда, откуда мы делаем кулачки, x = 3, а temp1 и temp2 неинициализированы.
Затем мы помещаем в стек, который мы хотим назначить, temp1, x = 2, а temp1 и temp2 неинициализированы.Мы снова вызываем, и у нас есть стек
(assign temp1, x = 1, -, -)
(assign temp1, x = 2, -, -)
(out , x = 3, -, -)
, теперь мы возвращаем 1 и делаем второй вызов и получаем
(assign temp2, x = 0, -, -)
(assign temp1, x = 2, temp1 = 1, -)
(out , x = 3, -, -)
, теперь он снова возвращает 1
(assign temp1, x = 2, temp1 = 1, temp2 = 1)
(out , x = 3, -, -)
так что это возвращает 2, и мы получаем
(out , x = 3, temp1 =2, -)
Итак, теперь мы вернемся к
(assign temp2, x = 1, -, -)
(out , x = 3, temp1 =2, -)
, из которого мы можем видеть наш выход.