递归实现斐波那契慢因重复计算子问题,需记忆化;递推用滚动变量更安全高效;生产环境优先递推,仅教学或DFS等需递归语义时用递归。

递归实现 fibonacci 为什么慢得明显?
因为没加记忆化,每次算 fib(40) 会重复计算成百上千次子问题。比如 fib(38) 在 fib(39) 和 fib(40) 的调用链里各算一遍,指数级爆炸。
- 别直接写裸递归:
return fib(n-1) + fib(n-2);——n > 45就卡顿明显 - 如果真要用递归,必须配
std::vector或std::unordered_map缓存结果,否则就是自找麻烦 - 编译器几乎不会为这种递归做尾调用优化(C++ 标准不保证),别指望它自动变快
递推法怎么写才不容易越界或出错?
用两个变量滚动更新最安全,比开数组省空间、无越界风险,也避免了 int 溢出时的未定义行为。
- 初始值必须设对:
prev2 = 0, prev1 = 1(对应fib(0)=0, fib(1)=1) - 循环从
i = 2开始,到i 结束,别漏掉边界 - 注意类型:
int只能算到fib(46)左右,要更大就换long long或unsigned long long - 如果
n == 0或n == 1,直接返回,别让循环跑空
std::vector 存整个数列时要注意什么?
适合需要多次查不同位置值的场景,比如后续还要反复调用 fib(10)、fib(25),但初始化成本高、内存占得多。
- 构造时指定大小:
std::vector<long long> dp(n+1);</long>,不然dp[i]访问会越界 - 别忘了手动赋初值:
dp[0] = 0; dp[1] = 1;,否则是默认初始化(对long long是 0,但逻辑上不能依赖这个) - 如果只用到前
k项,却预分配了n+1个元素(n >> k),纯属浪费 - 在函数内频繁创建大
std::vector,可能触发堆分配,影响性能
什么时候该用递归、什么时候必须切到递推?
看需求是否真需要“递归语义”——比如教学演示、配合 DFS 遍历树结构;否则生产代码一律优先递推。
立即学习“C++免费学习笔记(深入)”;
- 调试阶段用递归验证逻辑没问题,上线前必须换成递推
- 输入
n来自用户或文件?立刻检查范围:if (n 90),然后拒绝或报错,别硬算 - 用
constexpr在编译期算小值(如n )可以,但别指望它处理运行时变量 - 面试写递归被追问“怎么优化”,答不出滚动数组就等于没答到位
递归和递推不是风格选择,是复杂度分水岭。溢出、越界、栈溢出、重复计算——每个坑都踩过才算真写过斐波那契。











