跳臺階面試題

之前一直不會思考這類型的題,正好看到july的博客有此題的解法,描述和解題思路很清楚,拷貝過來加深印象

原文 http://blog.csdn.net/v_july_v/article/details/6126444

跳臺階問題

題目:一個臺階總共有n級,如果一次可以跳1級,也可以跳2級。
求總共有多少總跳法,並分析算法的時間複雜度。

首先我們考慮最簡單的情況。如果只有1級臺階,那顯然只有一種跳法。
如果有2級臺階,那就有兩種跳的方法了:一種是分兩次跳,每次跳1級;另外一種就是一次跳2級。

現在我們再來討論一般情況。我們把n級臺階時的跳法看成是n的函數,記爲f(n)。
當n>2時,第一次跳的時候就有兩種不同的選擇:一是第一次只跳1級,
此時跳法數目等於後面剩下的n-1級臺階的跳法數目,即爲f(n-1);
另外一種選擇是第一次跳2級,此時跳法數目等於後面剩下的n-2級臺階的跳法數目,即爲f(n-2)。
因此n級臺階時的不同跳法的總數f(n)=f(n-1)+(f-2)。

我們把上面的分析用一個公式總結如下:

        /  1                          n=1
f(n)=      2                          n=2
        /  f(n-1)+(f-2)               n>2

分析到這裏,相信很多人都能看出這就是我們熟悉的Fibonacci序列。

int jump_sum(int n)  //遞歸版本
{
    assert(n>0);
    if (n == 1 || n == 2) return n;
    return jump_sum(n-1)+jump_sum(n-2);
}

int jump_sum(int n) //迭代版本
{
    assert(n>0);
    if (n == 1 || n == 2) return n;

    int an, an_1=2, an_2=1;
    for (; n>=3; n--)
    {    
        an = an_2 + an_1;
        an_2 = an_1;
        an_1 = an;
    }
    return an;
}

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