之前一直不會思考這類型的題,正好看到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;
}