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)
答案 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