算法筆記_046:跳台階問題(Java)


目錄

1 問題描述

2 解決方案

2.1 遞歸法

2.2 迭代法

 


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著

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM