從鍵盤輸入一個整數n,求n階斐波拉切級數

從鍵盤輸入一個整數n,求n階斐波拉切級數

成績 10 開啓時間 2020年03月28日 星期六 16:20
折扣 0.8 折扣時間 2020年04月20日 星期一 19:20
允許遲交 關閉時間 2020年04月30日 星期四 16:20

請用遞歸算法,從鍵盤輸入一個小於25的整數n, 求斐波拉切級數。

求 n 階斐波拉切級數的公式如 下: 

當n=0或當n=1時    F ( n ) = 1

當n>1時              F ( n )= F ( n-1 ) +F ( n-2 )

  測試輸入 期待的輸出 時間限制 內存限制 額外進程
測試用例 1  
  1. 10↵
 
  1. 89↵
1秒 64M 0
測試用例 2  
  1. 23↵
 
  1. 46368↵
1秒 64M 0

題解

方法一 :遞推實現

本題很簡單,可以用一個數組a來存儲斐波拉切級數,其中數組的下標對應n的值。預設a[ 0 ], a[ i ]爲0,即可自底向上推出n級的結果 a[n]。

#include <stdio.h>   //導入stdio.h庫,裏面包含輸入輸出函數

int main() {
    int n;
    scanf("%d", &n);

    int a[26];
    a[0] = a[1] = 1;
    for (int i = 2; i <= n; i++) {
        a[i] = a[i - 1] + a[i - 2];
    }
    printf("%d\n", a[n]);
}

 這是一個指數時間複雜度\bg_white O(n)的算法,線性時間複雜度,可以接受。


方法二:遞歸實現

如果已經學過函數的話,可以遞歸實現:

#include <stdio.h>   //導入stdio.h庫,裏面包含輸入輸出函數

/* 返回n級斐波拉契數 */
int fib(int n) {
    if (n == 0 || n == 1)
        return 1;  //遞歸的終點
    return fib(n - 1) + fib(n - 2);  //遞歸調用自身
}

int main() {
    int n;
    scanf("%d", &n);
    printf("%d\n", fib(n));
}

當然,這裏的遞歸沒有優化,其效率和遞歸層次的承受度很低。不過對於本題AC夠了。

這是一個指數時間複雜度O(\alpha ^n)的算法,其中 \bg_white \alpha = (\sqrt{5} + 1) / 2,對...它就是優美的黃金分割率1.618...不過算法的運行效率隨n呈指數增長,實在是不夠優美.../(ㄒoㄒ)/~~


其他方法 :

實在學有餘力的同學還可以去搜搜將斐波拉契數轉化爲矩陣的冪運算,並且是使用快速冪實現。這是一個對數時間複雜度O(log(n))的算法,也是目前來說求斐波拉契數的可以實踐的最快算法。


本文給出了三種經典的計算斐波拉契數的算法,並且進行了簡簡單單的時間分析...對於時間複雜度和效率的分析初學者瞭解即可...主要是斐波拉契數列的問題太經典了,我遇見這個話題就忍不住多碼了點字哈哈哈~



有任何問題歡迎評論交流,如果本文對您有幫助不妨點點贊,嘻嘻~ 


end 

歡迎關注個人公衆號 雞翅編程 ”,這裏是認真且乖巧的碼農一枚。

---- 做最乖巧的博客er,做最紮實的程序員 ----

旨在用心寫好每一篇文章,平常會把筆記彙總成推送更新~

在這裏插入圖片描述

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