目錄
1 問題描述
一個台階總共有n級,如果一次可以跳1級,也可以跳2級,求總共有多少種跳法。
2 解決方案
2.1 遞歸法
如果整個台階只有1級,則顯然只有一種跳法。如果台階有2級,則有兩種跳法:一種是分兩次跳,每次跳1級;另一種是一次跳2級。
推廣到一般情況。則可以把n級台階時的跳法看成是n的函數,記為f(n)。當n > 2時,第一次跳一級還是兩級,決定了后面剩下的台階的跳法數目的不同:如果第一次只跳一級,則后面剩下的n-1級台階的跳法數目為f(n-1);如果第一次跳兩級,則后面剩下的n-2級台階的跳法數目為f(n-2)。因此,當n > 2時,n級台階的不同跳法的總數f(n) = f(n-1) + f(n-2)。其中f(1) = 1,f(2) = 2。
追本溯源,上述問題的本質就是斐波那契數問題。
具體代碼如下:
package com.liuzhen.array_2; public class JumpStepProblem { //方法1:遞歸 public int getFibonacci(int n){ if(n < 0) return -1; if(n <= 2) return n; return getFibonacci(n-1)+getFibonacci(n-2); } public static void main(String[] args){ JumpStepProblem test = new JumpStepProblem(); System.out.println("使用遞歸法求解結果:"+test.getFibonacci(10)); } }
運行結果:
使用遞歸法求解結果:89
2.2 迭代法
由2.1我們可知跳台階問題的核心,此處是把2.1 中遞歸法修改成高效率的迭代法。
具體代碼如下:
package com.liuzhen.array_2; public class JumpStepProblem { //解法2:迭代 public int getRecursion(int n){ if(n < 0) return -1; if(n <= 2) return n; int temp1 = 1; int temp2 = 2; int result = 0; for(int i = 3;i <= n;i++){ result = temp1 + temp2; temp1 = temp2; temp2 = result; } return result; } public static void main(String[] args){ JumpStepProblem test = new JumpStepProblem(); System.out.println("使用迭代法求解結果:"+test.getRecursion(10)); } }
運行結果:
使用迭代法求解結果:89
參考資料:
1.編程之法面試和算法心得 July著