停止递归函数Python

2024-09-28 21:35:57 发布

您现在位置: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

我正在尝试创建一个倒计时和倒计时程序。我只能选择使用一个函数,而且必须使用递归函数。但每次我运行这个程序时,它不会做任何事情:

^{pr2}$

我该怎么做才能让倒数计时正常工作呢?应该是这样的:

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

Tags: 函数import程序falseifdefsys事情
1条回答
网友
1楼 · 发布于 2024-09-28 21:35:57

对问题的解决方案进行猜测是很好的,但是在把你提出的解决方案作为你的问题的框架时。你要做的是倒计时,然后倒计时,而不是停止递归。停止递归需要添加exit()作为递归的base case,这是不合适的;正常的程序执行让call stack自然地解析(即,return到它的调用方)。也不建议修改sys.setrecursionlimit(10),因为它人为地操纵了一个全局限制,这很容易通过适当的基本情况条件在本地完成。在

这里有一种方法:在递归调用堆栈中向下打印n,然后在到达基本情况后返回的路上打印n。换言之,每个函数都会立即打印其编号,但在其下面的所有递归函数都已打印并解析其编号之前,不会再次打印其编号。在

例如,第一个名为bounce(4)的函数立即打印4,然后等待bounce(3)bounce(2)bounce(1)和{}来完成它们的工作,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)

输出:

^{pr2}$

和一个实验用的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

相关问题 更多 >