在看这个问题之前,我们先来看看斐波那契数列
斐波那契数列f(0)=0,f(1)=1,f(2)=f(1)+f(0),f(n)=f(n-1)+f(n-2)
求他n项的程序如下
public int Fibonacci(int n) {
if(n==0){
return 0;
}
if(n==1){
return 1;
}
return recursion(n);
}
public int recursion(int n){
if(n==2 || n==1){
return 1;
}
int a=recursion(n-1);
int b=recursion(n-2);
return a+b;
}
很容易的一个递归实现
接下来我们来看看青蛙跳台阶的问题,一只青蛙一次可以跳上1级台阶,也可以跳上2级。求该青蛙跳上一个n级的台阶总共有多少种跳法。
这个题的思路是找到第n项个前面项之间的关系,结论是f(n)=f(n-1)+f(n-2),这个式子是怎么来的呢?首先我们看(n-1)阶,他有一种方法到n阶台阶,再来看(n-2)阶,他有两种方法到n阶台阶,因为一步一步跳这种情况已经包含在了(n-1)阶跳一步到n阶,所以也只有一种,因为青蛙只能跳一步或者两步,因此(n-1)阶和(n-2)阶的跳法之和就等于n阶的跳法数。f(1)=1,f(2)=2,f(3)=3,f(n)=f(n-1)+f(n-2)和斐波那契数列类似,下面是程序实现
public int JumpFloor(int target) {
if(target==0)
return 0;
if(target==1)
return 1;
if(target==2)
return 2;
return recursion(target);
}
public int recursion(int n){
if(n==2)
return 2;
if(n==1)
return 1;
int a=recursion(n-1);
int b=recursion(n-2);
return a+b;
}
接下来我们看看青蛙能跳1,2,3…….n阶的情况,类似于之前的分析,f(n)=f(n-1)+f(n-2)+f(n-3)+…..+f(1)+1,f(1)=1
看起来这个式子很复杂,其实经过化简f(n)=2^n ,f(0)=0,f(1)=1,下面是程序实现
public int JumpFloorII(int target) {
if(target==0)
return 0;
return 1<<(target-1);
}
还有一个问题,也是这个类型的问题,我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法?解法和第一种跳台阶问题一样,下面是代码
public int RectCover(int target) {
if(target==0)
return 0;
if(target==1)
return 1;
if(target==2)
return 2;
return recursion(target);
}
public int recursion(int n){
if(n==2)
return 2;
if(n==1)
return 1;
int a=recursion(n-1);
int b=recursion(n-2);
return a+b;
}