在看這個問題之前,我們先來看看斐波那契數列
斐波那契數列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;
}