1. 程式人生 > >手寫算法系列——斐波那契數列

手寫算法系列——斐波那契數列

感覺能夠手寫各種演算法是一件很牛逼的事情,所以開始慢慢練習手寫程式碼,剛開始先找一個容易理解的方式背一背,慢慢再看效果。

斐波那契數列是一個很經典的演算法,實現起來很容易,主要是要理解它的演算法複雜度,以下用一張圖總結以下手寫要點:
這裡寫圖片描述

那麼斐波那契數列有咩有時間複雜度更低的實現方式呢?答案是有的,下面就介紹一種時間複雜度位O(log n)的思路:矩陣法。

這裡寫圖片描述

利用矩陣可以很好地將數列問題轉化為矩陣問題,而矩陣的問題呢,又可以把計算矩陣的(n-2)次方,我們又可以進行分解,即計算矩陣(n-2)/2次方的平方,逐步分解下去,由於折半計算矩陣次方,因而時間複雜度為O(log n)

遞迴法和迴圈法實現程式碼:

#include <stdio.h>
/*
斐波那契數列問題
1   1   2   3   5   8   13.... 
*/ 

//產生第n項元素——遞迴方法 
int F1 (int n)
{
    return n<2?n:F1(n-1)+F1(n-2);
}
//產生第n項元素——迴圈方法
int F2(int n)
{
    int a=1;
    int b=1;
    int result=1;
    for(int i=2;i<n;i++)
    {
        result=a+b;
        a=b;
        b=result;
    }   
    return
result; } //主函式 int main() { printf("F1: %d \n",F1(7)); printf("F2: %d \n",F2(7)); //求斐波那契數列的和 int index=5; int sum_1=0; int sum_2=0; for(int i=1;i<=index;i++) { sum_1+=F1(i); sum_2+=F2(i); } printf("求和結果:sum_1=%d sum2=%d",sum_1,sum_2); }

參考:

https://blog.csdn.net/beautyofmath/article/details/48184331
https://blog.csdn.net/dangzhangjing97/article/details/78778536