Я думал, что понимаю рекурсивные функции, но понял, что на самом деле не понимаю, что происходит под капотом.
Запуск этого кода Python для создания треугольной серии дает ожидаемые значения.
def fib(k):
result = 0
if (k > 0):
result = k + fib(k - 1)
print(f'after call k is {k} and result is {result}')
else:
print()
return result
#return k
print("Recursion Example Results")
fib(6)
И вот что он возвращает:
Recursion Example Results
after call k is 1 and result is 1
after call k is 2 and result is 3
after call k is 3 and result is 6
after call k is 4 and result is 10
after call k is 5 and result is 15
after call k is 6 and result is 21
Итак, это печать промежуточных значений, но я не понимаю, почему это зависит от того, что в конечном итоге возвращается.
Итак, если я изменю код, чтобы вернуть k:
def fib(k):
result = 0
if (k > 0):
result = k + fib(k - 1)
print(f'after call k is {k} and result is {result}')
else:
print()
#return result
return k
print("Recursion Example Results")
fib(6)
Я понимаю это:
Recursion Example Results
after call k is 1 and result is 1
after call k is 2 and result is 3
after call k is 3 and result is 5
after call k is 4 and result is 7
after call k is 5 and result is 9
after call k is 6 and result is 11
Почему такая разница и как она это рассчитывает? Почему он не возвращает k = 1,2,3,4,5,6?
Ни одна из них не является последовательностью Фибоначчи.
«Почему он не возвращает k = 1,2,3,4,5,6?» Но он возвращает k=1,2,3,4,5,6. В любом случае вы ИСПОЛЬЗУЕТЕ возврат функции fib()
как часть своего расчета k-fib(k-1)
, поэтому при возврате result
и k
вы получите разные значения.
Вы не печатаете возвращаемые значения, вы печатаете промежуточные вычисления. Если вы измените свою логику, чтобы печатать то, что вы на самом деле возвращаете, я думаю, вы увидите то, что ожидаете.
Последовательность Фибоначчи — это F(n) = F(n-1) + F(n-2)
.
В fib(k + 1)
используется возвращаемое значение fib(k)
.
Поэтому имеет значение, возвращается ли fib(k)
k
или result
.
Когда вы возвращаете k, результат становится result = k + k - 1
, а когда вы возвращаете результат, он выполняет сложение всех чисел в порядке убывания, например, для 6 это будет 6+5+4+3+2+1.
Возвращает k-е треугольное число
Этот вопрос похож на: Как мне получить («вернуть») результат (выход) из функции? Как я могу использовать результат позже?. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.