Может ли кто-нибудь объяснить мне, почему дается этот вывод?

#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")