1. 程式人生 > 其它 >演算法學習-03-斐波那契數列 和 跳臺階

演算法學習-03-斐波那契數列 和 跳臺階

技術標籤:演算法總結

演算法學習-03-斐波那契數列 和 跳臺階-C++

題目1:斐波那契數列

**:大家都知道斐波那契數列,現在要求輸入一個整數n,請你輸出斐波那契數列的第n項(從0開始,第0項為0,第1項是1)。

  1. 輸入:4
  2. 輸出:3
  3. 分析:斐波那契數列的定義是:F(0)=0,F(1)=1, F(n)=F(n - 1)+F(n - 2)(n ≥ 2,n ∈ N*),也就是說第三項等於前兩項的和,而當為0項為0,第1項為1,同理知第2項為1,第3項為2,第4項時為3。因此,我們可以採用遞迴的方法。

遞迴方法:
C++程式碼實現

     int Fibonacci(int n) {
         if
(n == 1 || n == 2) return 1; if(n == 0) return 0; return Fibonacci(n - 1) + Fibonacci(n - 2); }
  • 但是使用遞迴的方法,當n過大的時候,可能會造成遞迴過深的問題(上面程式碼是尾遞迴形式,一般來說編譯器會自動優化,因此不用擔心棧溢位的問題)。並且,呼叫遞迴的方法明顯執行速度會比較慢
    ,因此我們也可以採用非遞迴的方法。

非遞迴的方法:
C++程式碼實現

    int Fibonacci(int n) {
        if(n == 0) return
0; if(n == 1 || n == 2) return 1; //n1代表n-2,n2代表n-1 ,因此如果需要計算 //第n項,我們只需要第n-2項加n-1項。 int n1 = 1, n2 = 1, ans; for(int i = 3; i <= n; i++){ //計算第i項 ans = n1 + n2; //更新n1和n2,使之成為i-1和i-2項 n1 = n2; n2 =
ans; } return ans; }

題目2:跳臺階:

一隻青蛙一次可以跳上1級臺階,也可以跳上2級。求該青蛙跳上一個n級的臺階總共有多少種跳法(先後次序不同算不同的結果)。

  1. 輸入1:1
  2. 輸出1:1
  3. 輸入2:4
  4. 輸入2:5
  5. 分析:跳臺階與斐波那契數列的問題類似,因為如果要跳上第n階臺階,可以從第n-1階臺階一次條一級臺階,或者從第n-2階臺階一步跳兩級臺階,因此跳上第n階臺階的可能方法數量就是跳上n-1階臺階和n-2階臺階所有可能方法數量之和。所以我們同樣可以採用遞迴和非遞迴的方法實現。

C++實現程式碼

	//非遞迴方法
    int jumpFloor(int number) {
        if(number <= 2){return number;}
        int pre1 = 2, pre2 = 1;
        for(int i = 3;i <= number;i++){
            int temp = pre1 + pre2;
            pre2 = pre1;
            pre1 = temp;
        }
        return pre1;
    }
    
	//遞迴方法
    int jumpFloor(int number) {
        if(number == 1){return 1;}
        if(number == 2){return 2;}
        return jumpFloor(number-1)+jumpFloor(number-2);
    }

執行時間對比(牛客網的執行時間)

斐波那契數列
遞迴的方法
在這裡插入圖片描述

非遞迴的方法
在這裡插入圖片描述

跳臺階

遞迴的方法:
在這裡插入圖片描述
非遞迴的方法
在這裡插入圖片描述