初夏小談:斐波那契三種實現方法(C語言版)(第三種相信你沒見過)
阿新 • • 發佈:2018-11-25
斐波那契數列(Fibonaccisequnce),又稱黃金分割數列。研究斐波那契數列有相當重要的價值,例在現代物理、準晶體結構、化學等領域都有直接的應用。因此研究斐波那契數列也是很有必要的。
今天初夏將為大家帶來計算斐波那契數列第n位的三種方法
第一種利用遞迴的方法計算,程式碼相當簡單,但其重複計算率太高,導致其時間複雜度比指數還要爆炸式增長。不推薦此方法。但遞迴的思想卻相當的重要還是要理解並掌握。
#include<Aventador_SQ.h> int Fibonacci(int n) { if (1 == n|| 2 == n) { return 1; } else { return Fibonacci(n - 1) + Fibonacci(n - 2); } } int main() { int n = 0;//求取第n個數 int a = 0;//所求的數 scanf("%d", &n); a=Fibonacci(n); printf("第%d個數是%d\n",n,a); system("pause"); return 0; }
第二種是利用迴圈的方法,藉助三個變數進行交換。其時間複雜度是O(n)
#include<Aventador_SQ.h> void Fibonacci(int x) { if (x < 1) { printf("輸入錯誤!!!\n"); } else if (x < 3) { printf("第%d個數是1\n", x ); } else { int FiboOne = 1; int FiboTwo = 1; int FiboN = 0; int i=0; for (i = 3; i <= x; i++) { FiboN = FiboOne + FiboTwo; FiboOne = FiboTwo; FiboTwo = FiboN; //printf("%d\t%d\n", i, FiboN); } printf("第%d個數是%d\n", x, FiboN); } } int main() { int n; scanf("%d", &n); Fibonacci(n); system("pause"); return 0; }
第三種到了最傷腦子的演算法即矩陣,但執行速度大大提高。
#include<Aventador_SQ.h> void Fibonacci(int x) { int FFiboZero = 0, FiboZero = 0; int FFiboOne = 1, FiboOne = 1; int FFiboTwo = 1, FiboTwo = 1; int FiboN = 0; int i = 0; for (i = 2; i <= (x / 2); i++) { FiboN = FFiboTwo * FiboTwo + FFiboOne * FiboOne;//利用矩陣求出待求得數字 //進行交換達到移動中間變數 FFiboZero = FFiboOne; FFiboOne = FFiboTwo; FFiboTwo = FiboN; } FiboN = FFiboTwo * FFiboTwo + FFiboOne * FFiboOne;//得到最終的所求取得數 printf("%d\t%d\n", x, FiboN); } void JFibonacci(int x) { int FFiboZero = 0, FiboZero = 0; int FFiboOne = 1, FiboOne = 1; int FFiboTwo = 1, FiboTwo = 1; int FiboN = 0; int i = 0; for (i = 2; i <= ((x - 1) / 2); i++) { FiboN = FFiboTwo * FiboTwo + FFiboOne * FiboOne; FFiboZero = FFiboOne; FFiboOne = FFiboTwo; FFiboTwo = FiboN; } //當所求的位數是奇數時要另外計算第三種情況 FiboN = FFiboTwo * FFiboTwo + FFiboOne * FFiboOne; FFiboTwo = FFiboTwo * FFiboOne + FFiboOne * FFiboZero; FiboN = FiboN * FiboTwo + FFiboTwo * FiboOne; printf("%d\t%d\n", x, FiboN); } int main() { int n = 0; printf("n位數:"); scanf("%d", &n); if (n % 2 == 0) { JFibonacci(n);//n可以被2整除 } else { Fibonacci(n);//n不能被2整除 } system("pause"); return 0; }
與君共享,如果有更好的建議或意見歡迎留言。
QQ2630420233
珍&原始碼