[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秒,整數的...