Остановить рекурсивную функцию Python - PullRequest
0 голосов
/ 08 сентября 2018
import sys

sys.setrecursionlimit(10)
def bounce(n):
   if n <= 0:
       print(n,)
       bounce(n+1)


   else:
       print(n)
       bounce(n - 1)
       if (n==0 ):
           n==False

Я пытаюсь создать программу обратного отсчета и отсчета. У меня есть возможность использовать только одну функцию, и я должен использовать рекурсивную функцию. Но каждый раз, когда я запускаю программу, она ничего не делает:

4
3
2
1
0
1
0
1
0
1
0
1
0
1
0
1 

Что я могу сделать, чтобы отсчет работал так, как он должен? Это должно выглядеть так:

>>> bounce(4)
4
3
2
1
0
1
2
3
4
>>> bounce(0)

1 Ответ

0 голосов
/ 08 сентября 2018

Хорошо угадать решение вашей проблемы, но позаботьтесь о , предложив предложенное решение в качестве вашего вопроса. То, что вы пытаетесь сделать, - это отсчитывать, затем увеличивать, а не останавливать рекурсию. Остановка рекурсии потребует добавления 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...