一、爬樓梯算法遞歸實(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;
}