斐波那契数列可通过递归和动态规划实现,递归法代码简洁但时间复杂度为O(2^n),存在大量重复计算,适用于小n;动态规划通过保存中间结果避免重复计算,时间复杂度降为O(n),空间优化版本仅用O(1)空间,适合大n场景。

斐波那契数列是经典的数学问题,其定义为:F(0) = 0, F(1) = 1,且当 n ≥ 2 时,F(n) = F(n-1) + F(n-2)。在 C++ 中,可以通过递归和动态规划两种常见方式实现。下面分别介绍这两种方法,并对比它们的效率与适用场景。
递归解法(简单但低效)
最直观的实现方式是使用递归:
#includeusing namespace std; int fib_recursive(int n) { if (n <= 1) return n; return fib_recursive(n - 1) + fib_recursive(n - 2); }
int main() { int n = 10; cout << "F(" << n << ") = " << fib_recursive(n) << endl; return 0; }
说明:该方法代码简洁,逻辑清晰,但存在大量重复计算。例如,计算 F(5) 时会重复计算 F(3) 多次。时间复杂度为 O(2^n),空间复杂度为 O(n)(由于递归调用栈),不适合求较大的 n。
动态规划解法(高效推荐)
为了避免重复计算,可以使用动态规划(DP),将已计算的结果保存起来:
立即学习“C++免费学习笔记(深入)”;
#includeusing namespace std; int fib_dp(int n) { if (n <= 1) return n;
int* dp = new int[n + 1]; dp[0] = 0; dp[1] = 1; for (int i = 2; i zuojiankuohaophpcn= n; ++i) { dp[i] = dp[i - 1] + dp[i - 2]; } int result = dp[n]; delete[] dp; return result;}
优化空间版本:注意到每次只依赖前两个值,因此可以进一步优化空间:
int fib_optimized(int n) {
if (n <= 1)
return n;
int a = 0, b = 1, c;
for (int i = 2; i zuojiankuohaophpcn= n; ++i) {
c = a + b;
a = b;
b = c;
}
return b;}
这种方法时间复杂度为 O(n),空间复杂度为 O(1),非常高效。
性能对比与选择建议
- 递归:适合理解算法逻辑或 n 很小的情况。实际工程中不推荐。
- 动态规划(数组存储):适合需要保留中间结果的场景,如输出整个数列。
- 空间优化版 DP:推荐用于单独求某一项,效率最高。
对于 n > 40 的情况,递归可能耗时数秒甚至更久,而优化后的 DP 几乎瞬间完成。
基本上就这些。理解递归的缺陷和动态规划的优势,有助于写出更高效的代码。不复杂但容易忽略的是:哪怕一个简单的数学公式,实现方式不同,性能差异也会巨大。










