贝利信息

c++中如何计算斐波那契数列_c++递归实现斐波那契

日期:2026-01-08 00:00 / 作者:尼克
递归实现斐波那契时间复杂度为O(2^n),存在大量重复计算,n>40时显著变慢,n>100时易因递归深度过大导致栈溢出或段错误。

为什么递归实现 fibonacci 在 C++ 中容易超时或栈溢出

直接用递归写 fibonacci(n) 看似简洁,但时间复杂度是 O(2^n)。因为每次调用都分裂成两个子调用,大量重复计算(比如 fib(3) 会被算很多次)。当 n 超过 40,fib(45) 就可能卡住;n > 100 时,递归深度远超默认栈空间,触发 Segmentation fault (core dumped)stack overflow

如何用记忆化递归(Memoization)安全地保留递归结构

在递归基础上缓存已算结果,把重复计算从“指数级”降到“线性级”。关键是在函数外或传入一个 std::vector 作为缓存容器,下标即 n 值。

long long fib_memo(int n, std::vector& memo) {
    if (n <= 1) return n;
    if (memo[n] != -1) return memo[n];
    memo[n] = fib_memo(n-1, memo) + fib_memo(n-2, memo);
    return memo[n];
}

// 使用示例:
std::vector memo(100, -1); // 预分配 100 个位置
long long result = fib_memo(50, memo);

迭代法才是 C++ 中最实用的实现方式

用两个变量滚动更新,空间 O(1)、时间 O(n)、无栈风险,且编译器容易优化成极简汇编。

long long fib_iter(int n) {
    if (n <= 1) return n;
    long long a = 0, b = 1;
    for (int i = 2; i <= n; ++i) {
        long long c = a + b;
        a = b;
        b = c;
    }
    return b;
}

调试时遇到 fibonacci 输出异常的常见原因

不是算法错,往往是类型或边界没兜住:

真正写进工程代码前,先想清楚 n 的取值范围、是否需要大数、是否要线程安全——递归只是教学模型,不是解法本身。