python - 停止递归函数 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)
解决方案
对您的问题的解决方案进行猜测是很好的,但请注意将您提出的解决方案作为您的问题。您要做的是倒计时,然后倒计时,而不是停止递归。停止递归将需要添加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
推荐阅读
- laravel - laravel 错误 Illuminate\Routing\RouteFileRegistrar::register(): 失败
- javascript - lodash .groupBy。如何为分组输出添加自己的键?
- linux - 容器进程如何附加到 docker 中的 containerd-shim
- grafana - 我可以将 grafana 与支持的数据源列表中未列出的关系数据库一起使用吗?
- q# - 从 newchem 中的 .nw 生成 .yaml 所需的最低文件是什么?
- mongodb - 使用正则表达式项目嵌套文档
- visual-studio - 在 GitHub 存储库中上传 Visual Studio 项目设置
- javascript - 将 Greasemonkey 脚本转换为可注入的 JS(无插件)
- jbpm - 如何在 jBPM 7 中定义用于发送邮件的 SMTP?
- javascript - 在 IE11 中使用独立的 ES6 模块