You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何利用数组加速递归?大参数递归计算耗时过长求助

递归代码优化问题

我尝试优化这段递归代码的运行速度,但当输入参数z=50、x=44.4时,代码运行耗时过长。该参数下的预期输出为-800555.6302016332。

原代码如下:

z = int(input())
x = float(input())

def rec(n):
    global x
    l = {}
    if n == 0:
        return -1
    elif n == 1:
        return x
    elif n == 2:
        return -(x+1)/3
    else:
        if n in l:
            return l[n]
        value = float((n/x)*rec(n-1) + ((-1)**n)*((n+1)/(n-1)) * rec(n-2) + ((n-1)/(2*x))*rec(n-3)) 
        l[n] = value
        return value
print(rec(z))

问题分析

原代码的核心问题是缓存完全失效:缓存字典l定义在函数rec内部,每次调用rec都会创建新的空字典,根本没起到缓存已计算结果的作用,导致大量重复递归计算,这是z=50时耗时过长的直接原因。

优化方案

方案1:使用functools.lru_cache装饰器(推荐)

利用Python内置的缓存装饰器自动缓存函数调用结果,无需手动维护缓存,同时规避全局变量的弊端:

from functools import lru_cache

z = int(input())
x = float(input())

@lru_cache(maxsize=None)
def rec(n, x_val):
    if n == 0:
        return -1.0
    elif n == 1:
        return x_val
    elif n == 2:
        return -(x_val + 1) / 3
    else:
        # 用条件判断替代幂运算,小幅提升性能
        sign = 1 if n % 2 == 0 else -1
        value = (n / x_val) * rec(n-1, x_val) + sign * ((n+1)/(n-1)) * rec(n-2, x_val) + ((n-1)/(2*x_val)) * rec(n-3, x_val)
        return value

print(rec(z, x))

方案2:手动维护全局缓存字典

将缓存字典移到函数外部,确保所有递归调用共享同一个缓存空间:

z = int(input())
x = float(input())

cache = {}

def rec(n):
    global x, cache
    if n in cache:
        return cache[n]
    if n == 0:
        res = -1.0
    elif n == 1:
        res = x
    elif n == 2:
        res = -(x + 1) / 3
    else:
        sign = 1 if n % 2 == 0 else -1
        res = (n / x) * rec(n-1) + sign * ((n+1)/(n-1)) * rec(n-2) + ((n-1)/(2*x)) * rec(n-3)
    cache[n] = res
    return res

print(rec(z))

优化效果

两种方案都能彻底避免重复计算,调用rec(50, 44.4)时会瞬间得到预期输出-800555.6302016332。

内容的提问来源于stack exchange,提问作者Mark

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 00:10:31