zoukankan      html  css  js  c++  java
  • 在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))

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

    从csdn搬家过来的可能没有图片,原地址https://blog.csdn.net/weixin_38091140
  • 相关阅读:
    windows update error 0x8024401c
    linux杀毒软件ClamAV的安装使用
    firewalld防火墙设置
    RPM-GPG-KEY详解
    centos修改默认启动级别
    debian9.6修改系统语言
    ubuntu18.04修改网卡名称为eth0
    Windows server 1709(不含UI)模板部署
    NVIDIA-SMI系列命令总结
    bash: lspci: command not found解决方法
  • 原文地址:https://www.cnblogs.com/Apy-0816/p/11100270.html
Copyright © 2011-2022 走看看