此題出自牛客網的劍指offer專題:
題目描述
一隻青蛙一次可以跳上1級臺階,也可以跳上2級……它也可以跳上n級。求該青蛙跳上一個n級的臺階總共有多少種跳法。
題目分析如下:
這個題目跟以往的跳階梯題目不同,此時青蛙可供選擇的方案更多了,因爲它最多可以跳n個階梯。
如果階梯數爲1,那麼青蛙有1種跳的方式(即跳上一級臺階)
如果階梯數爲2,那麼青蛙有2種跳的方式(即跳上一級臺階和跳上兩級臺階)
如果階梯數爲3,青蛙有3種跳的方式(即跳上一級臺階,跳上兩級臺階以及跳上三級臺階)
...
如果階梯數爲n,則青蛙有n種跳的方式(即跳上1級臺階,也可以跳上2級……它也可以跳上n級)
那麼,我們可以推出什麼樣的結論呢?
以階梯數爲3爲例,當階梯數爲3時,青蛙有三種跳的方式,倘若以f(n)爲函數代表n級臺階中青蛙的總跳法,則當階梯數爲3時青蛙的總跳法爲f(3),當青蛙第一跳爲1階時,那麼階梯數只剩下2級,此時青蛙有f(2)種跳法,當青蛙第一跳爲2級時,此時階梯數只剩下1級,此時青蛙有f(1)種跳法,當青蛙第一跳爲3級時,此時階梯數只剩下0級,這也算作一種跳法。故可得f(3)=f(2)+f(1)+1;於是我們不難推出這樣的一個公式:
對於f(n) = f(n-1)+f(n-2)+...+f(1)+1,我們可以將f(n-1) = f(n-2)+f(n-3)+...+f(1)+1代入,由此可得:
f(n) = f(n-1)+f(n-1) = 2*f(n-1)
Java實現版本:
public class Solution {
public int JumpFloorII(int target) {
if(target==0){
return 1;
} else if(target==1){
return 1;
} else {
return JumpFloorII(target-1)*2;
}
}
}
C++實現版本:
class Solution {
public:
int jumpFloorII(int number) {
if(number==0){
return 1;
} else if(number==1){
return 1;
} else {
return jumpFloorII(number-1)*2;
}
}
};