跳臺階 -- “斐波那契數列” java
阿新 • • 發佈:2018-11-08
跳臺階 – “斐波那契數列” java
題目描述
一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。
解析1:推薦
對於本題,前提只有 一次 1階或者2階的跳法。
- a.如果兩種跳法,1階或者2階,那麼假定第一次跳的是一階,那麼剩下的是n-1個臺階,跳法是f(n-1);
- b.假定第一次跳的是2階,那麼剩下的是n-2個臺階,跳法是f(n-2)
- c.由a\b假設可以得出總跳法為: f(n) = f(n-1) + f(n-2)
- d.然後通過實際的情況可以得出:只有一階的時候 f(1) = 1 ,只有兩階的時候可以有 f(2) = 2
- e.可以發現最終得出的是一個斐波那契數列。
解析2:
比較傾向於找規律的解法,f(1) = 1, f(2) = 2, f(3) = 3, f(4) = 5, 可以總結出f(n) = f(n-1) + f(n-2)的規律,但是為什麼會出現這樣的規律呢?假設現在6個臺階,我們可以從第5跳一步到6,這樣的話有多少種方案跳到5就有多少種方案跳到6,另外我們也可以從4跳兩步跳到6,跳到4有多少種方案的話,就有多少種方案跳到6,其他的不能從3跳到6什麼的啦,所以最後就是f(6) = f(5) + f(4);這樣子也很好理解變態跳臺階的問題了。
程式碼1:
public class Solution { public int JumpFloor(int target) { int a = 1, b = 2; int c = 0; if(target <= 0){ return 0; }else if(target == 1){ c = a; }else if(target == 2){ c = b; }else{ for(int i = 3; i <= target; i++){ c = a + b; a = b; b = c; } } return c; } }
程式碼2:對程式碼1進行修改 – 推薦使用
public class Solution { public int JumpFloor(int target) { int a = 1, b = 2; int c = 0; if(target == 1){ c = a; } if(target == 2){ c = b; } if(target > 2){ for(int i = 3; i <= target; i++){ c = a + b; a = b; b = c; } } return c; } }
程式碼3:使用遞迴
public class Solution {
public int JumpFloor(int target) {
int a = 1, b = 2;
int c = 0;
if(target == 1){
c = a;
}
if(target == 2){
c = b;
}
if(target > 2){
c = JumpFloor(target - 1) + JumpFloor(target - 2);
}
return c;
}
}