Невозможно проверить вывод этой рекурсивной программы

У нас есть эта рекурсивная программа на Python:

def tri_recursion(k):
  if (k > 0):
    result = k + tri_recursion(k - 1)
    print(result)
  else:
    result = 0
  return result

print("\n\nRecursion Example Results")
tri_recursion(6)

Насколько я понимаю, вывод этой программы должен был быть:

1,3,5,7,9,11

Но фактический результат:

1,3,6,10,15,21

Может ли кто-нибудь объяснить причину этого? Насколько я понимаю, программа запустится как

k as 6, then 6 > 0 then system will call tri_recusrion(6-1) 
now k is 5, then 5 > 0 then system will call tri_recusrion(5-1) 
now k is 4, then 4 > 0 then system will call tri_recusrion(4-1) 
now k is 5, then 3 > 0 then system will call tri_recusrion(3-1) 
now k is 2, then 2 > 0 then system will call tri_recusrion(2-1) 
now k is 1, then 1 > 0 then system will call tri_recusrion(1-1) 
now k is 0, then 0 !> 0 condition will break

now function will start to return in reverse order:
tri_recusrion(1-1) in this case k is 1; k + (1-1) prints 1
tri_recusrion(2-1) in this case k is 2; k + (2-1) prints 3
tri_recusrion(3-1) in this case k is 3; k + (3-1) prints 5
tri_recusrion(4-1) in this case k is 4; k + (4-1) prints 7
tri_recusrion(5-1) in this case k is 5; k + (5-1) prints 9
tri_recusrion(6-1) in this case k is 6; k + (6-1) prints 11

@quamrana: я не могу понять, почему программа генерирует этот (фактический) вывод. нужно объяснение для этого вывода.

OpenStack 15.05.2022 22:06
Почему в 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
1
40
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Каждый раз, когда функция вызывается сама по себе, она добавляет текущее значение k к result. Текущий список, который вы печатаете, это 1, 1+2, 1+2+3, 1+2+3+4, ..., который также является 1, 3, 6, 10, .... Чтобы исправить ошибку, напишите result = 1 и result = 2 + tri_recursion(k - 1) вместо result = 0 и result = k + ... соответственно.

Вопрос не требует исправлений, он нуждается в пояснении.

gsan 15.05.2022 22:20
Ответ принят как подходящий

Позвольте мне сначала объяснить, что делает эта функция:

k — аргумент функции, базовое условие — когда k равно 0, результат равен 0 и ничего не печатается, функция просто возвращает 0

Если k больше 0, программа вычисляет tri_recursion(k-1), добавляет его к k и печатает, а затем возвращает.

Если мы вызовем функцию с аргументом k=6, она вызовет ту же функцию с k=5, затем она сделает то же самое с k=4 ... и, наконец, вызовет себя с k=0, и программа перестанет вызывать себя. После этого рассчитанный результат будет перенесен на вызов на один уровень раньше, чтобы завершить этот вызов.

Таким образом, шаги, которые нужно выполнить сразу после достижения программы k=0, следующие.

Поскольку k=0 возвращает 0, результат k=1 становится k + 0 => 1 + 0, печатает 1 и возвращает его

Поскольку k=1 возвращает 1, результат k=2 становится k + 1 => 2 + 1, печатает 3 и возвращает его

Поскольку k=2 возвращает 3, результат k=3 становится k + 3 => 3 + 3, печатает 6 и возвращает его

Поскольку k=3 возвращает 6, результат k=4 становится k + 6 => 4 + 6, печатает 10 и возвращает его

Поскольку k=4 возвращает 10, результат k=5 становится k + 10 => 5 + 10, печатает 15 и возвращает его

Поскольку k=5 возвращает 15, результат k=6 становится k + 15 => 6 + 15, печатает 21 и возвращает его

почему вы используете k + 0 => 1 + 0 в моем вопросе я вычитаю. Я не слежу за вашим ответом.

OpenStack 15.05.2022 22:25

что 0 указывает tri_recursion(k - 1), что является результатом одного результата рекурсии более низкого уровня.

gsan 15.05.2022 22:30

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