python recursion_Python最大递归,有关sys.setrecursionlimit()的问题

我对sys.setrecursionlimit()有一个疑问

从python docs这个函数:

将Python解释器堆栈的最大深度设置为limit。 此限制可防止无限递归导致C堆栈溢出和Python崩溃。

可能的最高限制取决于平台。 当用户拥有需要深度递归的程序和支持更高限制的平台时,用户可能需要将限制设置为更高。 这应该小心进行,因为过高的限制会导致崩溃。

这是我的问题:

让我们使用这个无用的递归函数:

def rec(N):

if N==0:

return 1

else:

return rec(N-1);

现在,将最大递归设置为100:

sys.setrecursionlimit(100)

如果尝试rec(99)(100次递归调用),则会得到:

RuntimeError: maximum recursion depth exceeded

要计算rec(99),我需要将递归限制设置为105。

为什么会这样呢?

它的名字不好。应该说堆栈深度,而不是递归深度。递归意味着它是限制的一遍又一遍的线程。实际上,您可能拥有只调用了100个深度的实际代码。我不推荐,但您可以。他们可以摆脱它,因为在实际世界中,您遇到这种情况的唯一机会就是递归。因此,当您崩溃时,看到"递归"一词会立即为您提供寻找内容的线索,而不是"堆栈"。

(堆栈应该为任何体面的程序员提供相同的线索,但老实说,您的代码刚刚崩溃了,您想要一条相关的错误消息,对吗?99.99999%的时间告诉您您到底搞砸了(您错过了基本情况)递归。))

谢谢,我想我应该更仔细地阅读定义,而不要看函数的名称

它基于TOTAL堆栈的深度,而不是真正基于任何特定单个函数的深度。第一次调用rec()时,您的堆栈深度可能已经为5。

以5个递归函数为例。每个函数都进行98次递归调用,最后一个调用到下一个递归函数。递归限制为100,您是否真的要允许每个递归函数进行99次调用,总深度约为500次?不,这可能会使解释器在这些深度崩溃。

因此,递归限制是全局所有函数的最大深度,而不是任何单个命名函数的最大深度。

仍然需要Python运行时进行函数调用才能访问您的函数。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值