提问者:小点点

线性递归关系的递归函数遇到递归错误


我有这个递归函数:

def My_recu_fun(i):
    if i < 4:
        return i+1
    return 55692*My_recu_fun(i-4) - 9549*My_recu_fun(i-3) + 301*My_recu_fun(i-2) + 21*My_recu_fun(i-1)

如果我这样称呼它:

My_recu_fun(int(2e5))

我得到这个错误:

RecursionError:相比之下超过了最大递归深度

现在我希望通过使用NumPy来解决这个问题。但是我不明白我怎么能做到这一点。


共2个答案

匿名用户

问题是,根据初始参数i,函数将被执行指数级的次数。函数需要重新计算它在过程中已经计算过的结果的次数非常多。

当您需要进行密集的数组/矩阵运算时,使用NumPy可能是一个好主意,但它本身并不能解决这个特定的递归问题。

您可以使用记忆来避免这种重新计算。但最好采用自下而上的迭代方法,只跟踪最后4个结果:

def My_fun(i):
    if i < 4: 
        return i+1
    a, b, c, d = 1, 2, 3, 4
    for j in range(3, i):
        a, b, c, d = b, c, d, 55692*a - 9549*b + 301*c + 21*d
    return d

请注意,此函数生成的数字很快就会变得非常大。

以下是一些统计数据:

匿名用户

My_recu_fun(int(2e5))运行My_recu_fun超过2*10^5(所以200.000)次。Python假设它是一个bug(因为它超过10^4次)并希望阻止它。您可以使用以下方法关闭该行为:

import sys
sys.setrecursionlimit(n)

其中n是所需的递归量。我无法估计My_recu_fun递归了多少次,所以你必须估计。

除此之外,我建议使用函数工具的缓存装饰器来加快速度:

import sys
from functools import cache

n = 500000
sys.setrecursionlimit(n)

@cache
def My_recu_fun(i):
    if i < 4: return i+1

    return 55692*My_recu_fun(i-4) - 9549*My_recu_fun(i-3) + 301*My_recu_fun(i-2) + 21*My_recu_fun(i-1)