动态规划实现斐波那契数列
代码回顾:
#include <iostream>
using namespace std;// 动态规划实现,时间复杂度 O(n)
unsigned long long fibonacciDP(int n) {if (n <= 1) return n;unsigned long long prev2 = 0;unsigned long long prev1 = 1;unsigned long long curr;for (int i = 2; i <= n; ++i) {curr = prev1 + prev2;prev2 = prev1;prev1 = curr;}return curr;
}int main() {int n;cout << "Enter a number: ";cin >> n;cout << "Fibonacci(" << n << ") = " << fibonacciDP(n) << endl;return 0;
}
详细介绍
-
函数定义:
unsigned long long fibonacciDP(int n) {
定义了一个名为
fibonacciDP
的函数,它接收一个整数n
,返回类型为unsigned long long
,用于表示第n
个斐波那契数。 -
处理基本情况:
if (n <= 1) return n;
如果
n
小于或等于1,直接返回n
,因为斐波那契数列的第0个和第1个数分别为0和1。 -
初始化变量:
unsigned long long prev2 = 0; unsigned long long prev1 = 1; unsigned long long curr;
初始化
prev2
和prev1
分别为0和1,这两个变量用于存储前两个斐波那契数。curr
用于存储当前计算的斐波那契数。 -
计算斐波那契数:
for (int i = 2; i <= n; ++i) {curr = prev1 + prev2;prev2 = prev1;prev1 = curr; }
使用一个循环从2开始迭代到
n
,每次循环中计算当前的斐波那契数curr
,并更新prev2
和prev1
。 -
返回结果:
return curr;
返回第
n
个斐波那契数。
时间复杂度分析
- 每次计算
curr
都是由前两个已知值prev1
和prev2
相加得到的,且这些值在每次迭代时都会更新。 - 该算法的核心循环从
2
运行到n
,共进行n-1
次操作。 - 因此,时间复杂度是 (O(n))。
空间复杂度分析
- 在这个实现中,我们只使用了常数个变量
prev2
、prev1
和curr
来存储当前和之前的斐波那契数。 - 无论
n
多大,所需的额外空间(不包括输入和输出)都是固定的。 - 因此,空间复杂度是 (O(1))。
总结
- 时间复杂度: (O(n)),因为我们需要从2迭代到
n
来计算斐波那契数。 - 空间复杂度: (O(1)),因为我们只使用了固定数量的变量来存储中间结果。
这种动态规划的方法通过减少不必要的重复计算,大大提高了计算效率,且只需常数空间,因此在计算斐波那契数列时非常高效。