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

如何提升Python递归函数速度?解决其运行过慢或无结果问题

修复递归函数并提升速度的方案

你的递归函数本质是类似斐波那契数列的递推结构,但指数级的重复计算是导致运行极慢的核心原因——每次计算x(a)都会重复计算x(a-1)、x(a-2)以及它们的所有子问题,比如x(5)会触发x(4)和x(3),而x(4)又会再次触发x(3)和x(2),随着a增大,重复计算量呈爆炸式增长。以下是几种高效的修复方案:

方案1:添加记忆化缓存

利用Python内置的functools.lru_cache装饰器缓存已经计算过的结果,避免重复计算,时间复杂度直接降到O(n):

from functools import lru_cache

@lru_cache(maxsize=None)
def x(a):
    return x(a - 1) + x(a - 2) + 42 if a > 1 else a

print(x(195))

也可以手动用字典实现缓存,适合不想引入装饰器的场景:

cache = {}
def x(a):
    if a in cache:
        return cache[a]
    if a <= 1:
        res = a
    else:
        res = x(a - 1) + x(a - 2) + 42
    cache[a] = res
    return res

print(x(195))

方案2:改用迭代实现

递归调用本身有一定的栈开销,迭代可以彻底避免递归栈的潜在问题,同时空间复杂度优化到O(1):

def x(a):
    if a <= 1:
        return a
    prev_prev = 0  # x(0)
    prev = 1       # x(1)
    for i in range(2, a + 1):
        current = prev + prev_prev + 42
        prev_prev, prev = prev, current
    return prev

print(x(195))

方案3:推导通项公式(数学优化)

原递推式是线性非齐次递推关系,可推导通项公式直接计算结果:

当a>1时,x(a) = x(a-1) + x(a-2) + 42;x(0)=0,x(1)=1

推导后得到的通项公式实现如下(利用浮点数计算后取整,精度足够覆盖a=195的场景):

import math

phi = (1 + math.sqrt(5)) / 2
psi = (1 - math.sqrt(5)) / 2

def x(a):
    if a <= 1:
        return a
    A = (43 + math.sqrt(5)) / math.sqrt(5)
    B = (43 - math.sqrt(5)) / (-math.sqrt(5))
    return round(A * (phi ** a) + B * (psi ** a) - 42)

print(x(195))

内容的提问来源于stack exchange,提问作者Hahan't

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 13:01:40