python函数递归调用时对深度没有限制_在Python程序中设置函数最大递归深度

在函数调用时,为了保证能够正确返回,必须进行保存现场和恢复现场,也就是被调函数结束后能够回到主调函数中离开时的位置然后继续执行主调函数中的代码。这些现场或上下文信息保存在线程栈中,而线程栈的大小是有限的。

对于函数递归调用,会将大量的上下文信息入栈,如果递归深度过大,会导致线程栈空间不足而崩溃。

在Python中,为了防止栈崩溃,默认递归深度是有限的。

# 这是一个简单的递归函数

def demo(n=0):

try:

demo(n+1)

except:

print(n)

demo()

通过这个简单的无限递归,你会发现并没有无限下去,而是到了一个限度就没有递归了,这是默认的递归是有限度的。

但是你可以通过修改默认递归深度来控制他例如:

import sys

# 如果确实需要很深的递归深度,可以使用sys模块中的setrecursionlimit()函数修改默认的最大深度限制。

sys.setrecursionlimit(1000)

# 这是一个简单的递归函数

def demo(n=0):

try:

demo(n+1)

except:

print(n)

demo()

这次的递归深度明显就比上一次的不一样了。再用一个例子来说明一下:

import sys

from functools import lru_cache

# 如果确实需要很深的递归深度,可以使用sys模块中的setrecursionlimit()函数修改默认的最大深度限制。

sys.setrecursionlimit(3000)

@lru_cache(maxsize=64)

def cni(n, i):

if n == i or i == 0:

return 1

return cni(n - 1, i) + cni(n - 1, i - 1)

print(cni(900, 100))

这也是一个修改默认的最大限制的递归了

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值