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

递归实现的斐波那契数列代码n>40时运行过慢,求优化方案

代码问题说明

你提供的代码不存在语法或逻辑错误,输出结果完全正确。运行耗时长是朴素递归实现斐波那契数列的固有缺陷:
这种实现会产生大量重复计算,例如计算fib(5)时需要重复计算2次fib(3)、3次fib(2),n越大重复计算的量级越高,整体时间复杂度为指数级O(2ⁿ),当n=50时需要执行的运算次数已经超过千亿次,自然会出现明显卡顿。

可行优化方案
  • 方案1:记忆化递归(顶向下动态规划)
    新增数组/哈希表存储已经计算过的斐波那契值,遇到重复计算需求时直接读取存储的结果,无需重复递归,时间复杂度降为O(n)。
    示例代码:
    #include<iostream>
    #include<vector>
    using namespace std;
    
    vector<long int> memo;
    long int fib(int a)
    {
        if(a<=1) return a;
        if(memo[a] != 0) return memo[a];
        memo[a] = fib(a-1) + fib(a-2);
        return memo[a];
    }
    int main()
    {
        int n;
        cin>>n;
        memo.resize(n+1, 0);
        cout<<fib(n);
        return 0;
    }
    
  • 方案2:迭代实现(底向上动态规划,空间优化版)
    放弃递归逻辑,从fib(0)、fib(1)开始逐步向上推导到fib(n),且仅存储前两项的计算结果,空间复杂度压到O(1),是工程中最常用的实现方案。
    示例代码:
    #include<iostream>
    using namespace std;
    
    int main()
    {
        int n;
        cin>>n;
        if(n<=1) {
            cout<<n;
            return 0;
        }
        long int prev_prev = 0, prev = 1, curr;
        for(int i=2; i<=n; i++){
            curr = prev_prev + prev;
            prev_prev = prev;
            prev = curr;
        }
        cout<<prev;
        return 0;
    }
    
  • 方案3:矩阵快速幂/通项公式法
    当n规模达到1e6以上时,可以用矩阵快速幂或者斐波那契通项公式实现O(logn)时间复杂度的计算,不过要注意数值溢出问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 03:06:03