斐波那契數列

本人錄製技術視頻地址:https://edu.csdn.net/lecturer/1899 歡迎觀看。

大家在高中學習數學的時候,也許都接觸過 斐波那契 數列:

1,1,2,3,5,8......

也就是說,除了第一個和第二個元素外,後面的元素的值均爲其前兩個元素值的和。但在我印象中,老師從來沒有介紹過這個數列的通項公式(即一個數學表達式能清晰的表達出它的規律)。到了大學的時候,作爲電子或者計算機相關學科的同學們,會學習C語言的相關知識,那個時候,典型的編程題,也會拿 斐波那契 數列舉例。

首先,我們可以根據斐波那契數列的規律,得出它的推導公式:


然後,我們根據推導公式,很容易用C語言實現其算法

int result(int index) {
    if (index == 1 || index == 2) {
        return 1;
    }
    return result(index - 1) + result(index - 2);
}

緊接着的工作就是調用即可:

int main(int argc, const char * argv[]) {
    
    clock_t start = clock();
    printf("%d\n", result(45));
    clock_t end = clock();
    
    double duration = (double)(end - start);
    printf( "%f seconds\n", duration / CLOCKS_PER_SEC);
    return 0;
}

我們可以嘗試傳入不同的數值,便可以得到相應的結果。但是如上例中,當我嘗試得到 斐波那契 數列的第45個位置的值時,耗時很久; 那是因爲以上算法,採用的是遞歸算法;效率低下。 打印結果如下:



從上面的推導公式,可以看出來,我們並沒有得到Fn關於n的函數,即通項公式。 上面只是利用計算機強行進行計算;但我們可以從數學的角度進一步分析 斐波那契 數列,即嘗試得到它的通項公式!!!

一、 我們假設數列的生成函數如下:


其中 F1, F2, F3, F4... 就是斐波那契數列的值, 這裏爲1,1,2,3...

二、 將上面式子分別乘以 x 和 x的平方,結果如下:‘


三、 將上面式子,第一個 + 第二個 - 第三個

得到左邊的結果:’


得到右邊的結果:


而根據文章一開頭的推導公式,我們知道 從 x的三次方之後, 其係數結果均爲0, 所有右邊的最終結果就是 -F1*x, 而F1的值是1, 所有右邊的結果就是 -x.

綜上所述,我們可以得到 斐波那契 數列的生成函數:


四、 根據高中知識,我們可以知道,多次表達式的分數形式可以轉化爲低次表示式的和的形式


進一步可以得到:


然後將結果帶入公式,去除掉 R 和 S,可得:


五、 級數展開公式

根據大學級數公式,我們可知:


帶入第四步中的公式可得:


於是,我們得到了 斐波那契 數列的通項公式爲:


而 r 與 s又滿足條件:


所以可以計算得出:


因爲,我們最終可以得出 斐波那契 數列的通項公式爲:



此時,我們使用C語言重新實現,代碼如下:

int result2(int index) {
    return (int)(((pow((1 + sqrt(5.0)) / 2, index) - pow((1 - sqrt(5.0)) / 2, index)) / sqrt(5.0)));
}

然後觀察打印結果:


可以看出,計算結果一直,但是運行時間卻快了六萬多倍。。。


從這裏,我們可以看出,在實現編程的時候,可以首先考慮利用數學方法優化程序設計或者計算!!!!

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