#python
Вопрос:
def recursion(n):
if n < 10:
return
m = n/3
recursion(m)
print(m)
recursion(243)
OUTPUT: 9.0
27.0
81.0
Я бы ожидал, что результат будет только 9.0…
Как именно работает включение функции в функцию? Т. Е. каков поток выполнения этого конкретного фрагмента кода?
Комментарии:
1. Пожалуйста, отформатируйте свой код как код, чтобы нам было легче его прочитать.
2. Почему вы ожидаете, что результат будет только 9.0?
3. Рекурсивный вызов происходит с функцией n.отформатируйте свой код для большей четкости
4. Я проголосовал за этот вопрос, потому что рекурсию нелегко понять, и я сам совершил достаточно ошибок, используя ее.
Ответ №1:
Вот дерево вызовов того, что происходит:
recursion(243)
recursion(81)
recursion(27)
recursion(9)
return
print(9)
print(27)
print(81)
Как вы можете видеть, все инструкции печати выполняются после всех вызовов recursion
.
Чтобы иметь только 9
в качестве вывода, вы должны просто иметь print(n)
в if
перед return
и удалить все остальные print
.
Ответ №2:
Вы печатаете значение m
каждого рекурсивного вызова, вы можете вернуть значение вместо него, а затем распечатать его следующим образом:
def recursion(n):
if n < 10:
return n
m = n/3
return recursion(m)
print recursion(243)
Ответ №3:
Ваше print(m)
утверждение является частью каждого шага рекурсии, а не только последнего, поэтому все они будут выводить свое текущее значение m
. Если вы хотите, чтобы он печатал только последний шаг, поместите print
инструкцию перед return
инструкцией (в условие разрыва).
Ответ №4:
Что ж, вы ожидаете чего-то неправильного.
У вас есть оператор печати, который выполняется на каждом уровне рекурсии, кроме последнего, так что это то, что вы получаете.
Ответ №5:
Первый раунд : n = 243, так что это больше, чем 10 м = 243/3 = 81
Второй раунд: n = 81, так что это больше, чем 10 м = 81/3 = 27
Третий раунд: n = 27, так что это больше, чем 10 м = 27/3 = 9
Четвертый раунд: n = 9, это меньше, чем 10, так что возвращайтесь
1 - Printing m of third round (9)
2 - Printing m of second round (27)
3 - Printing m of third round (81)
Этот результат имеет смысл.
Ответ №6:
Вы рекурсивно вызываете свою функцию и печатаете свои номера, сложенные ранее, если вы хотите видеть только последний номер, вы должны поместить печать на свой if
def recursion(n):
if n < 10:
print(n)
return
m = n/3
recursion(m)
Этот код будет напечатан только 9.0
Если вы хотите увидеть поток своей функции, используйте их, и вы должны увидеть трассировку
def recursion(n):
print("stacking")
if n < 10:
print(n)
return
m = n/3
recursion(m)
print("unstack")