菲波那锲数
定义
斐波那契数,亦称之为斐波那契数列(意大利语: Successione di Fibonacci),又称黄金分割数列、费波那西数列、费波拿契数、费氏数列和兔子数列,指的是这样一个数列:0、1、1、2、3、5、8、13、21、……在数学上,斐波纳契数列以如下被以递归的方法定义:F0=0,F1=1,Fn=F(n-1)+F(n-2)(n>=2,n∈N*),用文字来说,就是斐波那契数列列由 0 和 1 开始,之后的斐波那契数列系数就由之前的两数相加。
涉及的算法题
一、跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法(先后次序不同算不同的结果)。
思路解析
根据题意,有一个台阶时,有1中跳法,两个台阶时,有2种跳法,三个台阶时,有3种跳法,推广到n个台阶f(n) = f(n-1) + f(n-2) 种跳法。所以有代码如下:
public class Solution {
public int JumpFloor(int target) {
if(target == 0){
return 0;
}
if(target == 1){
return 1;
}
if(target == 2){
return 2;
}
if(target == 3){
return 3;
}
int a = 2;
int b = 3;
int c = 4;
int d = 0;
while(c <= target){
d = a+b;
a = b;
b = d;
c++;
}
return d;
}
}
如果选择使用递归的方法,则代码如下:
public class Solution {
public int JumpFloor(int n) {
if(n==0){
return 0;
}
if(n==1){
return 1;
}
if(n == 2){
return 2;
}
return JumpFloor(n-1)+JumpFloor(n-2);
}
}
二、变态跳台阶
一只青蛙一次可以跳上1级台阶,也可以跳上2级……它也可以跳上n级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
思路解析
根据题意,有一个台阶时,有1中跳法,两个台阶时,有2种跳法,三个台阶时,有4种跳法,四个台阶时,有8种跳法,推广到n个台阶f(n) =2* f(n-1) 种跳法。所以有代码如下:
public class Solution {
public int JumpFloorII(int target) {
if(target == 0){
return 0;
}
if(target == 1){
return 1;
}
return 1 <<(target - 1);
}
}
三、上楼梯
有个小孩正在上楼梯,楼梯有n阶台阶,小孩一次可以上1阶、2阶、3阶。请实现一个方法,计算小孩有多少种上楼的方式。为了防止溢出,请将结果Mod 1000000007 给定一个正整数int n,请返回一个数,代表上楼的方式数。保证n小于等于100000。
思路解析
根据题意,有一个楼梯时,有1中上法,两个楼梯时,有2种上法,三个楼梯时,有4种商法,四个台阶时,有7种跳法,推广到n个台阶f(n) =f(n-1) +f(n-2)+f(n-3) 种跳法。所以有代码如下:
public class GoUpstairs {
public int countWays(int n) {
int n1 = 1;
int n2 = 2;
int n3 = 4;
int sum = 0;
if(n == 1){
return n1;
}
if(n == 2){
return n2;
}
if(n == 3){
return n3;
}
for(int i = 4;i <= n;i++){
sum = ((n1+n2)%1000000007+n3)%1000000007;
n1 = n2;
n2 = n3;
n3 = sum;
}
return sum;
}
}
总结
上述三个问题都与斐波那契数相关,在学习中我们还会遇到许多的相关的题目,还需要并不断的深入学习。