停止递归函数Python

时间:2018-09-08 14:25:42

标签: python function recursion

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 :(得分:1)

最好是对您的问题的解决方案进行猜测,但是take care可以将您提出的解决方案作为您的问题。您要尝试的是先倒数,然后倒数,而不是停止递归。停止递归将需要添加exit()作为递归base case,这是不合适的;正常的程序执行可使call stack自然地解决(即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