【遞歸和循環】變態跳階梯

此題出自牛客網的劍指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;於是我們不難推出這樣的一個公式:\int n = \left\{\begin{matrix} & \\ 1 (n=1) & \\ f(n-1)+f(n-2)+...+f(1)+1 (n>=2) & \end{matrix}\right.

對於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;
        }
    }
};

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章