Хорошо угадать решение вашей проблемы, но позаботьтесь о , предложив предложенное решение в качестве вашего вопроса. То, что вы пытаетесь сделать, - это отсчитывать, затем увеличивать, а не останавливать рекурсию. Остановка рекурсии потребует добавления exit()
в качестве рекурсивного базового случая , и это неуместно; нормальное выполнение программы позволяет стеку вызовов разрешаться естественным образом (то есть return
его вызывающей стороне). Модификация sys.setrecursionlimit(10)
также не рекомендуется, потому что она искусственно манипулирует глобальным пределом, который легко сделать локально с помощью соответствующего условного базового случая.
Вот один из подходов: напечатайте n
на пути вниз по стеку рекурсивных вызовов, затем напечатайте n
на пути назад, когда будет достигнут ваш базовый случай. Другими словами, каждая функция немедленно печатает свой номер, но не печатает свой номер второй раз, пока все рекурсивные функции, расположенные ниже, не напечатают свои номера и не разрешатся.
Например, первая вызванная функция bounce(4)
печатает 4
немедленно, затем ждет, пока bounce(3)
, bounce(2)
, bounce(1)
и bounce(0)
выполнят свою работу и return
. После этого bounce(4)
наконец печатает 4
еще раз, прежде чем вернуться в область вызова. Все вызываемые функции ведут себя одинаково (bounce(0)
немного отличается; мы должны условно ограничить его одним отпечатком, чтобы соответствовать требованию - if n:
проверяет, является ли число ненулевым).
def bounce(n):
if n >= 0:
print(n)
bounce(n - 1)
if n:
print(n)
bounce(4)
Выход:
4
3
2
1
0
1
2
3
4
И repl для экспериментов.
Если вам трудно понять, как работает стек вызовов, попробуйте добавить отступ, чтобы показать, насколько вы глубоки (время увеличивается сверху вниз, рекурсивная глубина увеличивается слева направо).
def bounce(n, depth=0):
if n >= 0:
print("{}{}".format(" " * depth, n))
bounce(n - 1, depth + 1)
if n:
print("{}{}".format(" " * depth, n))
bounce(4)
initial call, bounce(4)
|
v
4 base case, bounce(0)
3 |
2 v
1
0
1 <-- heading back up the call stack, bounce(1)
2
3
4