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
等等,那么即使没有实际的递归,您也会达到“递归极限”。这只是对允许调用堆栈的深度的限制,以防止堆栈溢出。谢谢!当我在评论中讨论时,同样的事情也触动了我。我真傻。:-)更像是涂鸦只要系统允许,我会接受这个答案。