Python 3.x 绕过系统递归限制?
我正试着去思考递归,我有一个问题。在我的机器上,Python 3.x 绕过系统递归限制?,python-3.x,recursion,Python 3.x,Recursion,我正试着去思考递归,我有一个问题。在我的机器上,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, (sta
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
。然而,我的程序如何能够绕过1000
调用的递归限制?实际上,您代码的“递归深度”仅为log_2(100000)(约),即cca 17
当然,您正在进行更多的递归调用,但在任何时候,堆栈上同时出现的调用都不会超过17个(因为舍入错误,可能会多一点)
如何验证这一点的好方法:
-创建全局变量depth
-当总和开始时,将深度增加一
-当总和结束时,将深度减少一
现在,您可以检查
深度的最大值是多少以及原因。您认为它为什么会进行1000多次递归调用?@user2357112非常有趣的问题!对于远远超过1000的输入大小,在返回后调用的前半部分不使用1000
调用吗?@user2357112ah!你是说这更像是二进制搜索,而我实际上在每一半中进行log100000
=16次调用?递归限制是对调用堆栈深度的限制;递归调用树的同级分支不受彼此的递归限制。名称是什么无关紧要。如果您通过f2000
编写了2000个函数f1
,并调用了f1
调用f2
等等,那么即使没有实际的递归,您也会达到“递归极限”。这只是对允许调用堆栈的深度的限制,以防止堆栈溢出。谢谢!当我在评论中讨论时,同样的事情也触动了我。我真傻。:-)更像是涂鸦只要系统允许,我会接受这个答案。