1. 程式人生 > >做題感悟:爬樓梯

做題感悟:爬樓梯

可能看到標題大家會很驚訝,畢竟這道題實在是太簡單了,但是,我要講的並不是這道題。

爬樓梯

總時間限制: 1000ms
 
記憶體限制: 
65536kB
描述

樹老師爬樓梯,他可以每次走1級或者2級,輸入樓梯的級數,求不同的走法數
例如:樓梯一共有3級,他可以每次都走一級,或者第一次走一級,第二次走兩級
也可以第一次走兩級,第二次走一級,一共3種方法。

輸入
輸入包含若干行,每行包含一個正整數N,代表樓梯級數,1 <= N <= 30
輸出
不同的走法數,每一行輸入對應一行輸出
樣例輸入
    5
    8
    10
樣例輸出
    8
    34
    89
好吧,我還是簡單說一下吧。這道題屬於遞迴題中最為基礎的一道關於拆分可能性的題,因此我們只要找到遞迴通式並確定出口就可以了。例如:爬到頂樓有兩種情況,即爬一層和爬兩層,因此可以得到遞迴通式f(n)=f(n-1)+f(n-2)。遞迴出口則是f(1)=1,f(2)=2 。由此,這道題就解完了。
那麼,終於到了要講的重點了:
  有人可能會發現一個問題:為什麼我敢用cin,cout?
  其實我也不想用。。。
  但是,由於這道題沒有給出資料組數,因此只能用迴圈讀入的方法,而這裡便用到了cin的最大的好處也是最大的缺點:cin讀入時不識別空格,即剛開始遇到空格便跳過,讀入中遇到空格便中斷,由此我們就可以有效的避免scanf讀入資料爆時間的尷尬境況。
  
  其實,cin和scanf各有各的優點,各有各的缺陷,例如:cin和scanf相比就無法讀入大量資料。因此,只有合理使用,揚長避短,才能最大化優化程式碼。
最後,附上本題程式碼
#include<iostream>
using namespace std;
int a[35];
int pa(int x)
{
    if(x==1)
    {
        return 1;
    }
    else if(x==2)
    {
        return 2;
    }
    else
    {
        return pa(x-1)+pa(x-2);
    }
}
int main()
{
    int n;
    while(cin >>n)
    {
        cout << pa(n) <<endl;
    }
    return 0;
}