面試題10——斐波那契數列

斐波那契數列的定義:每一項都是前兩項的和。
自己思路:
1、腳趾頭想都是遞歸,基本每個算法書講遞歸的時候必然會舉斐波那契的例子。但是這是面試題,應該不會這麼簡單,遞歸太耗時間了,考官應該會想節省時間的方法。
2、想起來遞歸,非遞歸可能要用到棧來實現遞歸。

具體面試的時候用哪種思路,可以和面試官討論具體的細節,然後選擇符合面試官要求的方法。
遞歸思路:

#include<iostream>
using namespace std;

int fabonaqi(int n){
    if(n<0){
        std::cout << "error input" << std::endl;
    }
    if(n==0){
        return 0;
    }
    if(n==1){
        return 1;
    }
    else{
        return fabonaqi(n-1)+fabonaqi(n-2);
    }   
}
int main(){
    cout<<"input:"<<endl;
    int n;
    std::cin >> n;
    cout<<fabonaqi(n)<<endl;
    return 0;
}

循環思路:

#include<iostream>

using namespace std;

int main(){
    int temp0 = 0;
    int temp1 = 1;
    int sum = 0;
    int n;
    cout<<"input:"<<endl;
    cin>>n;
    for(int i = 0; i<n; i++){
        sum = temp0+temp1;
        temp0 = temp1;
        temp1 = sum;
    }
    cout<<"result:"<<endl;
    return 0;
}

代碼調試:無bug

主要要和面試官聊清楚他的想法,是需要省空間,還是需要省時間。

題目的拓展:
1、青蛙跳臺階,一次可以跳一級臺階,也可以跳兩級臺階,問跳N級臺階總共有多少種跳法。
思路:假設青蛙第一次跳一級臺階,那麼求剩下N-1級臺階,如果青蛙第一次跳兩級臺階,那麼求剩下N-2級臺階的 跳法,所以總共的跳法即爲跳N-1級臺階和跳N-2級臺階的跳法和。這麼看來題目的本質就是斐波那契數列。
2、磚塊填補問題,用一塊8個2x1的磚塊去填補一個2x8的磚塊,可以橫着或者豎着放,有多少種填法。
思路:分解思考,假設第一個磚塊橫着放,那麼就是求剩下7個磚塊的填補方案,假設第一個磚塊橫着放,那麼下面一個磚塊也得橫着放,求剩下6個磚塊的填補方案。總的方案就是f(n-1)+f(n-2)的和。

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