在超过最大递归深度时编写非递归函数

Writing a non-recursive function as maximum recursion depth has been exceeded

我想知道是否有人可以帮助我将这段代码重写为非递归的,以便它可以计算更大的数字,我当前的代码如下所示:

def T(n):
    if n < 3:
        return n
    return T(n - 1) + 2 * T(n - 2) - T(n - 3)

该函数是为算术目的而设计的,其中 T(0) = 0、T(1) = 1、T(2) = 2、T(3) = 4、T(5) = 7 等...

例如,我希望能够计算高达 T(1000) 的值,我不知道是否有一种简单的方法来重写代码,或者是否只是计算值的情况? 任何帮助将不胜感激,我目前收到错误 'maximum recursion depth exceeded'

使用“滚动”方法跟踪最后三个结果,并在添加新结果时同时踢掉最旧的结果:

def T(n):
    if n < 3:
        return n
    a, b, c = 0, 1, 2
    for i in range(2, n):
        a, b, c = b, c, c + 2*b - a
    return c

有一个用于缓存函数值的装饰器,因此您无需修改​​即可使用您的函数:

from functools import lru_cache
@lru_cache(maxsize=None)
def T(n):
    if n < 3:
        return n
    return T(n - 1) + 2 * T(n - 2) - T(n - 3)

从 python 3.9 开始:

from functools import cache
@cache

那么你可以运行:

T(1000)

并且会非常快速地完成执行无需任何修改

最好用动态规划

def t(n):
    if n <3:
        return n
    temp = [0] * (n +1)
    temp[1], temp [2] = 1,2
    for i in range(3,n+1,1):
        temp[i] = temp[i - 1] + 2 * temp[i - 2] - temp[i - 3]
    return temp[n]