斐波那契数列可通过递归和动态规划实现,递归法代码简洁但时间复杂度为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++ 中,可以通过递归和动态规划两种常见方式实现。下面分别介绍这两种方法,并对比它们的效率与适用场景。
最直观的实现方式是使用递归:
#include <iostream>
using namespace std;
<p>int fib_recursive(int n) {
if (n <= 1)
return n;
return fib_recursive(n - 1) + fib_recursive(n - 2);
}</p><p>int main() {
int n = 10;
cout << "F(" << n << ") = " << fib_recursive(n) << endl;
return 0;
}</p>说明:该方法代码简洁,逻辑清晰,但存在大量重复计算。例如,计算 F(5) 时会重复计算 F(3) 多次。时间复杂度为 O(2^n),空间复杂度为 O(n)(由于递归调用栈),不适合求较大的 n。
为了避免重复计算,可以使用动态规划(DP),将已计算的结果保存起来:
立即学习“C++免费学习笔记(深入)”;
#include <iostream>
using namespace std;
<p>int fib_dp(int n) {
if (n <= 1)
return n;</p><pre class='brush:php;toolbar:false;'>int* dp = new int[n + 1];
dp[0] = 0;
dp[1] = 1;
for (int i = 2; i <= 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;
<pre class='brush:php;toolbar:false;'>int a = 0, b = 1, c;
for (int i = 2; i <= n; ++i) {
c = a + b;
a = b;
b = c;
}
return b;}
这种方法时间复杂度为 O(n),空间复杂度为 O(1),非常高效。
对于 n > 40 的情况,递归可能耗时数秒甚至更久,而优化后的 DP 几乎瞬间完成。
基本上就这些。理解递归的缺陷和动态规划的优势,有助于写出更高效的代码。不复杂但容易忽略的是:哪怕一个简单的数学公式,实现方式不同,性能差异也会巨大。
以上就是C++如何实现斐波那契数列_C++动态规划与递归解法对比的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号