遞歸算法之-爬樓梯

一、爬樓梯算法遞歸實(shí)現(xiàn):假設(shè)一個(gè)樓梯有N階臺(tái)階,人每次最多跨M階,求總共的爬樓梯的方案數(shù)
例如:1-100的臺(tái)階,每個(gè)臺(tái)階隨機(jī)權(quán)重,每次只能走一個(gè)或者兩個(gè)臺(tái)階,找出從1-100最短路徑
遞歸法:

private static int calculateCount(int ladder, int maxJump) {
    int jump = 0;
    if (ladder == 0) {
        return 1;//ladder=0,進(jìn)入到最底層,記做一種走法
    }
    if (ladder >= maxJump) { // 剩下的樓梯大于最大可跳躍數(shù)
       for (int i = 1; i <= maxJump; i++) {
               jump += calculateCount(ladder - i, maxJump);
            }
             }
else {
       // 剩下的樓梯不足最大可跳躍數(shù)
      jump = calculateCount(ladder, ladder);
} return jump; }

二、非遞歸實(shí)現(xiàn)(動(dòng)態(tài)規(guī)劃):(局限就是只能是1或2步)
當(dāng)樓梯數(shù)為1、2、3、4、5時(shí),對(duì)應(yīng)的爬法有:1、2、3、5、8、13、21種。
可以發(fā)現(xiàn),隨著樓梯數(shù)n的增加,爬法總數(shù)呈現(xiàn)斐波那契數(shù)列規(guī)律增加,即f(n) = f(n-1) + f(n-2)
知道這個(gè)規(guī)律后,使用下面的循環(huán)即可實(shí)現(xiàn):

public int count(int n){
    if(n==1 || n==2){
        return n;
    }
    int a = 1;
    int b = 2;
    int total;    
    for(int i=3;i<=n;i++){
        int temp = b;
        b = a + b;
        a = temp;
    }
    return b;
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容