代码之家  ›  专栏  ›  技术社区  ›  Erel Segal-Halevi

使用LRUICACHE时,“最大递归深度超过”

  •  0
  • Erel Segal-Halevi  · 技术社区  · 7 年前

    我想用lru缓存计算一个递归函数下面是它的简化版本:

    from functools import lru_cache
    
    @lru_cache(maxsize=None)
    def f(n:int)->int:
        if (n==0): return 1
        return n+f(n-1)
    
    ### MAIN ###
    print(f(1000))
    

    当我运行f(100)时效果很好,但是使用f(1000)时,我得到:

    RecursionError: maximum recursion depth exceeded in comparison
    

    一种解决方法是为f自己计算一个值表有没有不需要我手动创建值表的解决方案?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Tim Peters    7 年前

    注意你 可以 按原样使用函数,但需要确保每个新调用在到达缓存值或递归基本情况之前不必递归超过几百个级别;例如。,

    >>> f(400)
    80201
    >>> f(800)  # will stop recursing at 400
    320401
    >>> f(1000) # will stop recursing at 800
    500501
    

    我有时会使用这种方法;—)更一般地说,您可以编写一个包装函数,反复尝试 f(n) ,捕获 RecursionError ,并放弃使用更小的值调用它 n . 例如,

    def superf(n, step=400):
        pending = []
        while True:
            pending.append(n)
            try:
                f(n)
                break
            except RecursionError:
                n = max(n - step, 0)
        while pending:
            x = f(pending.pop())
        return x
    

    那么

    >>> superf(100000)
    5000050001