題目
樓梯有n階臺階,上樓可以一步上1階,也可以一步上2階,編一程序計算共有多少種不同的走法。
解答
歸納
- 當只有1階臺階時,只有1種走法,只走1階。
即n=1,f(1)=1 - 當有2階臺階時,一次走1階有1種走法,一次走2階有2種走法。
即n=2,f(2)=1+1=2 - 當有n階臺階時,從第n-1階到第n階走1階有f(n-1)中走法,從第n-2階到第n階走2階有f(n-2)階走法。
即,f(n)=f(n-1)+f(n-2)
推導公式
f(1) = 1
f(2) = 2
f(n) = f(n-1) + f(n-2) , n>2
代碼
C語言代碼實現:
int upSteps(int stepSum){
if(stepSum < 1){
return -1;
}
if(stepSum == 1 ){
return 1;
}
if(stepSum == 2){
return 2;
}
return upSteps(stepSum-1)+upSteps(stepSum-2);
}
擴展1
一個臺階總共有n級,如果一次可以跳1級,可以跳2級,也可以跳3級。求總共有多少總跳法。
歸納
- 當只有1階臺階時,只有1種走法,只走1階。
即n=1,f(1)=1 - 當有2階臺階時,一次走1階有1種走法,一次走2階有2種走法。
即n=2,f(2)=1+1=2 - 當有3階臺階時,一次走1階有1種走法,一次走2階有2種走法,一次走3階有1中走法。
即,n=3,f(3)=1+2+1=4 - 當有n階臺階時,從第n-1階到第n階走1階有f(n-1)中走法,從第n-2階到第n階走2階有f(n-2)階走法,從第n-3到n階走3階有f(n-3)階走法。
即,f(n)=f(n-1)+f(n-2)+f(n-3)
推導公式
f(1) = 1
f(2) = 2
f(3) = 4
f(n) = f(n-1) + f(n-2) +f(n-3) , n>3
代碼
C語言代碼實現:
int upStepsEx1(int stepSum){
if(stepSum <= 0){
return -1;
}
if(stepSum == 1 ){
return 1;
}
if(stepSum == 2){
return 2;
}
if(stepSum == 3 ){
return 4;
}
return upStepsEx1(stepSum-1)+upStepsEx1(stepSum-2)+upStepsEx1(stepSum-3);
}
擴展2
一個臺階總共有n級,如果一次可以跳1級,也可以跳2級……它也可以跳上n級。此時該青蛙跳上一個n級的臺階總共有多少種跳法。
歸納
- 當只有1階臺階時,只有1種走法,只走1階。
即n=1,f(1)=1 - 當有2階臺階時,一次走1階有1種走法,一次走2階有2種走法。
即n=2,f(2)=f(1)+1=1+1=2 - 當有3階臺階時,一次走1階有1種走法,一次走2階有2種走法,一次走3階有1中走法。
即,n=3,f(3)=f(1)+f(2)+1=1+2+1=4 - 當有n階臺階時,從第n-1階到第n階走1階有f(n-1)種走法,從第n-2階到第n階走2階有f(n-2)種走法,從第n-3到n階走3階有f(n-3)種走法……,從第2階到n階走n-1階有f(2)中走法,從第1階到n階走n階有f(1)種走法。
即,f(n)=f(n-1)+f(n-2)+f(n-3)+…+f(2)+f(1)。
推導公式
f(1) = 1
f(2) = 2
f(n) = f(n-1) + f(n-2) +f(n-3)+…+f(2)+f(1) , n>3
因 f(n-1)=f(n-2)+f(n-3)+…+f(2)+f(1),
即 f(n)=2*f(n-1)
代碼
C語言代碼實現:
int upStepsEx2(int stepSum){
if(stepSum <= 0){
return -1;
}
if(stepSum == 1 ){
return 1;
}
if(stepSum == 2){
return 2;
}
return 2*upStepsEx2(stepSum-1);
}