首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用lru_cache时“超过最大递归深度”

使用lru_cache时“超过最大递归深度”
EN

Stack Overflow用户
提问于 2018-07-24 18:32:59
回答 1查看 1K关注 0票数 2

我想使用lru_cache计算递归函数。以下是它的简化版本:

代码语言:javascript
复制
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),我得到:

代码语言:javascript
复制
RecursionError: maximum recursion depth exceeded in comparison

一种解决方案是自己计算f的值表。是否有不需要手动创建值表的解决方案?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-07-24 18:56:26

请注意,您可以以-is方式使用您的函数,但是您需要确保每个新的调用在到达缓存值或递归基本情况之前不需要递归超过几百个级别;例如,

代码语言:javascript
复制
>>> f(400)
80201
>>> f(800)  # will stop recursing at 400
320401
>>> f(1000) # will stop recursing at 800
500501

通常,您可以编写一个包装器函数,反复尝试f(n),捕获RecursionError,并放弃使用越来越小的n值来调用它。例如,

代码语言:javascript
复制
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

然后

代码语言:javascript
复制
>>> superf(100000)
5000050001
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51505404

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档