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

C语言不修改test函数声明前提下加速三阶递推递归函数的方法

性能优化方案

原函数性能差的核心原因是存在大量重复子问题计算,时间复杂度为指数级O(3ⁿ),n增大时调用次数呈爆炸式增长。在不修改函数声明的前提下,有两种常用的高效实现方案:

方案1:迭代实现(最优,无额外空间开销)

直接从底向上递推,仅保留最近3个计算结果,时间复杂度O(n),空间复杂度O(1),完全消除递归栈开销和重复计算。
代码示例:

int test(int n) {
    // 边界条件和原逻辑完全一致
    if (n <= 2) {
        return n;
    }
    // 分别存储f(n-3)、f(n-2)、f(n-1)的结果
    int t0 = 0, t1 = 1, t2 = 2, cur;
    for (int i = 3; i <= n; i++) {
        cur = t0 + t1 + t2;
        // 滚动更新三个前置值
        t0 = t1;
        t1 = t2;
        t2 = cur;
    }
    return cur;
}

方案2:记忆化递归(改动最小,保留递归写法)

用静态缓存存储已经计算过的结果,避免重复计算,时间复杂度O(n),空间复杂度O(n),适合不想修改原有递归逻辑的场景。
代码示例:

int test(int n) {
    // 静态缓存:int类型下三阶递推到n=36就会溢出,开50长度足够覆盖所有有效输入
    static int cache[50];
    // 首次调用初始化缓存标记,-1表示未计算
    static int cache_init = 0;
    if (!cache_init) {
        for (int i = 0; i < 50; i++) {
            cache[i] = -1;
        }
        cache[0] = 0;
        cache[1] = 1;
        cache[2] = 2;
        cache_init = 1;
    }
    // 非法输入兼容
    if (n < 0 || n >= 50) {
        return 0;
    }
    // 缓存命中直接返回
    if (cache[n] != -1) {
        return cache[n];
    }
    // 未命中则计算并存入缓存
    cache[n] = test(n-1) + test(n-2) + test(n-3);
    return cache[n];
}

如果需要处理n极大的场景(超过int溢出范围,搭配大整数实现),可以进一步用矩阵快速幂把时间复杂度降到O(logn),普通场景下前两种方案已经足够满足性能需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 09:39:02