斐波那契數列

2021-06-21 21:21:11 字數 1809 閱讀 7126

[1]遞迴法

int fib(int index)

if(index==1|| index==2)

return fib1(index-1)+fib1(index-2);

}

[2]遞推法

int fib(int index)

int a1=1,a2=1,a3=1;

for(int i=0;i[3]通項公式法

fibonacci 數列的遞推公式是二次遞推式,二次遞推式的通用解法是轉換為如下形式:

轉換後的一次遞推式很容易生成聯合方程,求出通項式,以下是a0=0, a1=1時的 fibonacci 通項式:

[4]矩陣快冪法

fibonacci 數列可以轉化為乙個等價矩陣,其通項為:

利用乘法的高效性提公升效能,一般用於較大的fibonacci數,因為在int範圍內,其效能和**簡潔性不如遞推法。

乘法的好處是,如f(90),利用遞推,需要90次迴圈。但利用冪乘,將a^90拆分為a^90=a^64 * a^16 * a^8 * a^2,而a^64、a^16、a^8可以依次由a^2計算得出。只用幾次乘法即可達到90次迴圈遞推的效果,n越大,加速性越好。

矩陣乘法的實現**比較簡單,不再給出具體**。只討論其中的拆分子步驟。

n的拆分有多種, 甚至無需拆分,直接分割遞迴也可以。**如下:

//來自

matrix power1 (lld p) //矩陣冪 a^k 

tp = multi (tp, tp) ;

p >>= 1 ;

} return tr ;

} matrix multi (matrix a, matrix b) //兩矩陣相乘

return c ;

}

[5]數的二冪拆分避免遞迴重複計算

將任意正整數拆分為2的冪的和,如90=2^6+2^4+2^3+2^1.

拆分演算法各種各樣,下面給出我的二冪拆分法:基於位操作的二冪拆分

這種方法的核心是找到冪指數,下面是找冪指數的**(核心是分離數的bit位)

typedef struct _x //_x is a tag of type x, generally used in the body for self pointer

x; //define struct x

x splitint(unsigned value)

return bitarray;

}更一般地,分離數的bit位**模板如下(核心**只有一行,即可分離所有位):

void func_splitint(unsigned value)

//如果n為偶數的話,n/2還是n/2

else

finnal = result;

return finnal;

}int main(void)

{ long long a[4];

int n;

cin>>n;

//矩陣按一位陣列設定,t[0]即為febonacci(n)

a[0] = 1;

a[1] = 1;

a[2] = 1;

a[3] = 0;

long long *t = matrix(a,n-1);

cout該演算法的複雜度為o(logn)。

斐波那契數列 斐波那契數列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秒,整數的...