• 在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
  • 相关阅读:
    ASP.NET 分页数据源:: PagedDataSource //可分页数据源
    strtok
    FloydWarshall算法详解(转)
    Tom Clancy's Splinter Cell: Double Agent
    暴雪COO确认:星际争霸2.0要来了
    wxWidgets 2.8.0 released
    如饥似渴
    大乘法器遇见小乘法器
    GLEW 1.3.5 adds OpenGL 2.1 and NVIDIA G80 extensions
    DevIL真是好用得想哭
  • 原文地址:https://www.cnblogs.com/Apy-0816/p/11100270.html
Copyright © 2020-2023  润新知