我试图绕过递归并提出一个问题。在我的机器上,while()
给出了sys.getrecursionlimit()
,这意味着我可以递归地调用函数最多1000次。但是,我能够成功运行以下代码:
1000
这几乎是瞬间完成的,并给了我def sum_badly(S, start, stop):
if start == stop:
return S[start]
else:
return sum_badly(S, start, (start+stop)//2) + sum_badly(S, (start+stop)//2 + 1, stop)
MAX = 100000
S = range(MAX)
print(sum_badly(S, 0, MAX-1))
的预期答案。但是,我的程序如何能够绕过4999950000
调用的递归限制?
答案 0 :(得分:3)
实际上,代码的“递归深度”仅为log_2(100000)(约),即cca 17.
当然,你正在进行更多的递归调用,但是同时堆栈中的调用次数超过17次(好吧,因为舍入错误可能会多一点)
如何验证这一点的好方法:
- 创建全局变量depth
- 在sum_badly开始的任何时候将depth
加1
- 在sum_badly结束时随时减少depth
现在,您可以检查depth
的最大值以及原因。