Почему в рекурсивной функции Python имеет значение, какие параметры возвращаются?

Я думал, что понимаю рекурсивные функции, но понял, что на самом деле не понимаю, что происходит под капотом.

Запуск этого кода 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?

Этот вопрос похож на: Как мне получить («вернуть») результат (выход) из функции? Как я могу использовать результат позже?. Если вы считаете, что это другое, отредактируйте вопрос, поясните, чем он отличается и/или как ответы на этот вопрос не помогают решить вашу проблему.

Anerdw 19.08.2024 18:37

Ни одна из них не является последовательностью Фибоначчи.

user2357112 19.08.2024 18:38

«Почему он не возвращает k = 1,2,3,4,5,6?» Но он возвращает k=1,2,3,4,5,6. В любом случае вы ИСПОЛЬЗУЕТЕ возврат функции fib() как часть своего расчета k-fib(k-1), поэтому при возврате result и k вы получите разные значения.

JNevill 19.08.2024 18:44

Вы не печатаете возвращаемые значения, вы печатаете промежуточные вычисления. Если вы измените свою логику, чтобы печатать то, что вы на самом деле возвращаете, я думаю, вы увидите то, что ожидаете.

Mark Ransom 19.08.2024 18:45

Последовательность Фибоначчи — это F(n) = F(n-1) + F(n-2).

Barmar 19.08.2024 18:49
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
5
54
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

В fib(k + 1) используется возвращаемое значение fib(k).

Поэтому имеет значение, возвращается ли fib(k)k или result.

Ответ принят как подходящий

Когда вы возвращаете k, результат становится result = k + k - 1, а когда вы возвращаете результат, он выполняет сложение всех чисел в порядке убывания, например, для 6 это будет 6+5+4+3+2+1.

Возвращает k-е треугольное число

Pete Kirkham 19.08.2024 18:52

Другие вопросы по теме