首页 > 解决方案 > 停止递归函数 Python

问题描述

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)

标签: pythonfunctionrecursion

解决方案


对您的问题的解决方案进行猜测是很好的,但请注意将您提出的解决方案作为您的问题。您要做的是倒计时,然后倒计时,而不是停止递归。停止递归将需要添加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)

if __name__ == "__main__":
    bounce(4)

输出:

4
3
2
1
0
1
2
3
4

如果您无法理解调用堆栈的工作原理,请尝试添加缩进以显示您的深度(时间从上到下增加,递归深度从左到右增加)。

def bounce(n, depth=0):
    if n >= 0:
        print("{}{}".format("  " * depth, n))
        bounce(n - 1, depth + 1)

        if n:
            print("{}{}".format("  " * depth, n))

if __name__ == "__main__":
    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

推荐阅读