分治法例項 斐波那契數列

2021-08-15 15:55:42 字數 1031 閱讀 9312

我們都十分熟悉斐波那契數列的定義:fn = fn-1 + fn-2,其中f0 = 0、f1 = 1。

那麼我們如何求解斐波那契數列的某個特定項呢?

方法一:遞迴求解。

這種方法看似簡單,可是實際上我們會重複計算許多已經計算過的項,最後遞迴樹竟然是一棵完全二叉樹,時間複雜度達到了θ(φ^n),其中φ = (sqrt(5)+1)/2。我們不再討論此方案。

方法二:遞推求解。

即利用fn的定義式,以線性的複雜度o(n)完成方案。

方案三:利用fn = round(φ^n+φ^n),其中φ和φ為x²+x+1=0的兩個根。令人興奮,得到了o(1)!

但是,這種方法卻不能實際被應用,原因是計算機只能儲存有限位數的小數,由於φ和φ是無理數,在n較大的情況下,計算機無法保證一定的精度從而造成誤差。

前面的方案要麼就是效率過低,要麼就是不切實際,那麼有沒有一種好的方法呢?答案是肯定的。

方案四:(分治)矩陣乘法

原理:由線代知識不難證明:2x2的矩陣 ^ n = ;因此,模仿"快速冪"演算法,我們很容易得出以下**。

#include using namespace std;

//二階矩陣乘法

void matrixpow(int a[2][2], int b[2][2])

}// memcpy(a, temp, sizeof a); //這裡被坑慘了,sizeof a是乙個指標的大小!!!

memcpy(a, temp, sizeof temp);

}//矩陣快速冪

int qpow(int base[2][2], int n)

; //單位矩陣

while(n)

return res[0][1];

}int main()

; //原矩陣

cin>>n;

cout

}

斐波那契數列 斐波那契數列python實現

斐波那契數列 fibonacci sequence 又稱 分割數列 因數學家列昂納多 斐波那契 leonardoda fibonacci 以兔子繁殖為例子而引入,故又稱為 兔子數列 指的是這樣乙個數列 1 1 2 3 5 8 13 21 34 在數學上,斐波納契數列以如下被以遞推的方法定義 f 1 ...

迴圈斐波那契數列 斐波那契數列應用

什麼是斐波那契數列 斐波那契數列指的是這樣乙個數列 1,1,2,3,5,8,13,21,34,55,89,144 這個數列從第3項開始,每一項都等於前兩項之和 台階問題 有一段樓梯有10級台階,規定每一步只能跨一級或兩級,要登上第10級台階有幾種不同的走法?這就是乙個斐波那契數列 登上第一級台階有一...

斐波那契數列

1 題目描述 大家都知道斐波那契數列,現在要求輸入乙個整數n,請你輸出斐波那契數列的第n項。斐波那契數列的定義如下 輸入 輸入可能包含多個測試樣例,對於每個測試案例,輸入包括乙個整數n 1 n 70 輸出 對應每個測試案例,輸出第n項斐波那契數列的值。2 這是九度上的乙個題,要求時間限制1秒,整數的...