算法学习
BM62 斐波那契数列
https://www.nowcoder.com/practice/c6c7742f5ba7442aada113136ddea0c3?tpId=295&sfm=html&channel=nowcoder
题目描述:要求输入一个正整数 n ,请输出斐波那契数列的第 n 项。F(1)=F(2)=1,F(n)=F(n-1)+F(n-2)
思路1:
迭代相加
1.低于2项的数列,直接返回n。
2.初始化第0项,与第1项分别为0,1.
3.从第2项开始,逐渐按照公式累加,并更新相加数始终为下一项的前两项。
代码实现:
#include <iostream>
using namespace std;
class Solution {
public:
int Fibonacci(int n) {
if (n <= 1) //第0,1项
return n;
int res = 0;
int a = 0;
int b = 1;
for (int i = 2; i <= n; i++) { //第2项往后
res = a + b; //F(n)=F(n-1)+F(n-2)
a = b;
b = res;
}
return res;
}
};
思路2:
递归法
1.低于2项的数列,直接返回n。
2.对于当前n,递归调用函数计算两个子问题相加。
代码实现:
#include <iostream>
using namespace std;
class Solution {
public:
int Fibonacci(int n) {
if (n <= 1) //第0,1项
return n;
else
return Fibonacci(n - 1) + Fibonacci(n - 2);
return 0;
}
};
思路3:
动态规划
数组来解决
1.创建一个长度为的数组,因为只有才能有下标第项,我们用它记录前项斐波那契数列。
2.根据公式,初始化第0项和第1项(题目中是第1项和第2项,本质上一样的)。
3.遍历数组,依照公式某一项等于前两项之和,将数组后续元素补齐,即可得到。
代码实现:
#include <iostream>
using namespace std;
class Solution {
public:
int Fibonacci(int n) {
if (n <= 1) //第0,1项
return n;
int* fib = new int[n + 1];
fib[0] = 0;
fib[1] = 1;
for (int i = 2; i <= n; i++) //依次相加
fib[i] = fib[i - 1] + fib[i - 2];
return fib[n];
}
};