

新闻资讯
技术学院递归实现斐波那契时间复杂度为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。
fibonacci
if (n 边界判断,也无法改善指数级膨胀
在递归基础上缓存已算结果,把重复计算从“指数级”降到“线性级”。关键是在函数外或传入一个 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);
memo 必须初始化为无效值(如 -1),不能用 0——因为 fib(0) == 0
long long 防止 int 溢出:第 48 项就超过 int 最大值n 可能很大(如 1e6),改用动态规划迭代更稳妥(避免栈深度)用两个变量滚动更新,空间 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;
}
n = 1000000 也能秒出结果(数值会溢出,但逻辑不崩)fib(n) % 1000000007),直接在每次加法后取模即可std::pow 或矩阵快速幂来“炫技”——除非 n 是 1e18 级别且要求 O(log n)
fibonacci 输出异常的常见原因不是算法错,往往是类型或边界没兜住:
int fib(int n) → 第 47 项开始溢出,输出负数或乱码if (n ,导致无限调用直到栈满
unsigned int 但忘了 0 和 1 是合法输入,n-2 可能回绕成极大正数fib(-1) 应该报错或返回 0?C++ 不检查数组越界,memo[-1] 直接 UB真正写进工程代码前,先想清楚 n 的取值范围、是否需要大数、是否要线程安全——递归只是教学模型,不是解法本身。