题目
斐波那契数,通常用 F(n) 表示,形成的序列称为 斐波那契数列 。该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和。也就是:
F(0) = 0,F(1) = 1
F(n) = F(n - 1) + F(n - 2),其中 n > 1
通过n,计算F(n)
题目来源
https://leetcode-cn.com/problems/fibonacci-number/
递归解法
求解的函数是fib(n) ,第n个数就是第n-1的结果加上第n-2的结果。这是逆向看待。
代码如下:
class Solution {
public:
int fib(int n) {
if(n<=1)return n;
else return fib(n-1)+fib(n-2);
}
};
由于n的规模小于30,所以用递归解法就可以AC。
动态规划
不过仔细观察会发现内存消耗过于庞大,调用次数numCall(k)=2*fib(k+1)-1。
同时栈空间开销巨大,这时就可以采用三种方式来解决:
第一种是通过备忘录记录交叠子问题;
第二种是通过递推来避免如此大量的自身调用;
第三是通过数学工具来解决。
首先实现通过动态规划法:
class Solution {
public:
int tag[31];
int fib(int n) {
for(int i=0;i<=n;i++){
if(i<=1){
tag[i]=i;
}
else{
tag[i]=tag[i-1]+tag[i-2];
}
}
return tag[n];
}
};
递推(迭代法)
class Solution {
public:
int fib(int n) {
if(n<=1)return n;
int one=0;
int two=1;
int cur;
for(int i=2;i<=n;i++) {
cur=two+one;
one=two;
two=cur;
}
return cur;
}
};
公式法
通过公式法,需要引入cmath
class Solution {
public:
int fib(int n) {
return 1/sqrt(5) * ( pow( ((1+sqrt(5))/2) , n) - pow( ((1-sqrt(5))/2),n) );
}
};