难度:简单
斐波那契数,通常用F(n)表示,形成的序列称为斐波那契数列。该数列由0和1开始,后面的每一项数字都是前面两项数字的和。也解释:
F(0)=0,F(1)=1;
F(n)=F(n-1)+F(n-2),其中n>1
//给你n,请计算F(n).
示例:
输入:1
输出:1
解释:F(2)=F(1)+F(0)=1+0=1
虽然这道题被定义为简单题,但是他可以有多种算法对其进行解决,例如递归算法(Recursion),动态规划(Dynamic Brogramming),记忆化搜索(Memorization)等等,当然还有矩阵快速幂和通项公式的方法,但是俺都不会。主要还是使用了动态规划和递归算法,这两个简单方便。
方法一、动态规划法
因为斐波那契数的边界条件是F(0)=0和F(1)=1。当n>1时,每一项的和都等于前两项的和,因此有递推关系:F(n)=F(n-1)+F(n-2) 因为存在递推关系所以可以使用动态规划求解。代码如下:
class Solution{
public:
int fib(int n){
if(n<2){
return n; //前两位可以直接输出
}
int p=0,q=0,r=1;
for(int i=2;i<=n;i++){ //循环 假设p为F(n-2),q为F(n-1),r为F(n)
p=q;
q=r;
r=p+q;}
return r;
}
};
方法二、递归算法
咱能用较少的代码写出来的,自然就不要太多的代码啦,个人建议用递归比较好解决当然如果你想要使用矩阵快速幂和通项公式的话,你可能会瞬间回到大学的高数时代,想要学的朋友可以参考(力扣官方解法)
class Solution{
public:
int fib(int n){
if(n==1||n==0){
return n;
}
else {
return fib(n-1)+fib(n-2);
}
}
};
当然用三目运算符的话只要用一行就可以直接解决问题。
三目运算符 一般的格式为 x>y?x:y —> 只要?前面的内容为真则输出x,反之输出y。
class Solution {
public int fib(int n) {
return n <= 1 ? n : fib(n - 1) + fib(n - 2);
}
};
最下面的这个就是三目运算的结合,当然还有各种神奇的解法,仅供娱乐,属实暴力!
class Solution {
public int fib(int N) {
if(N==0)
return 0;
if(N==1)
return 1;
if(N==2)
return 1;
if(N==3)
return 2;
if(N==4)
return 3;
if(N==5)
return 5;
if(N==6)
return 8;
if(N==7)
return 13;
if(N==8)
return 21;
if(N==9)
return 34;
if(N==10)
return 55;
if(N==11)
return 89;
if(N==12)
return 144;
if(N==13)
return 233;
if(N==14)
return 377;
if(N==15)
return 610;
if(N==16)
return 987;
if(N==17)
return 1597;
if(N==18)
return 2584;
if(N==19)
return 4181;
if(N==20)
return 6765;
if(N==21)
return 10946;
if(N==22)
return 17711;
if(N==23)
return 28657;
if(N==24)
return 46368;
if(N==25)
return 75025;
if(N==26)
return 121393;
if(N==27)
return 196418;
if(N==28)
return 317811;
if(N==29)
return 514229;
if(N==30)
return 832040;
return 0;
}
}
每天收获一道算法题!