Fibonacci series(斐波納契數列)的幾種常見實現方式
阿新 • • 發佈:2019-02-02
費波那契數列的定義:
(義大利語:Successione di Fibonacci),又譯費波拿契數、斐波那契數列、斐波那契數列、黃金分割數列。
- (n≧2)
用文字來說,就是費波那契數列由0和1開始,之後的費波那契係數就由之前的兩數相加。
首幾個費波那契係數是:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233……
特別指出:0不是第一項,而是第零項。
下面是費波那契數列的幾種常見程式設計實現:
1、常規實現:
int Fibonacci(int n) { int a = 1, b = 1; if(n < 0) { printf("The fibonacci number exists only with nonnegative index.\n"); return -1; } else if (n == 0) return 0; else if(n==1 || n==2) return 1; else { for(int i=3; i<=n; i++) { int tmp = b; b = a + b; a = tmp; } return b; } }
2、遞迴實現:
int Fibonacci(int n)
{
if(n < 0)
printf("The fibonacci number exists only with nonnegative index.\n");
else
{
if(n == 0)
return 0;
else if(n == 1)
return 1;
else
return Fibonacci(n - 1) + Fibonacci(n - 2);
}
}
3、迭代實現:
int Fibonacci_iter(int a, int b, int count) { if(count < 0) printf("The fibonacci number exists only with nonnegative index.\n"); else if(count == 0) return b; else return Fibonacci_iter(a + b, a, count - 1); } int Fibonacci(int n) { return Fibonacci_iter(1, 0, n); }
4、超程式設計實現:
#include<iostream> using namespace std; int Result; //主模板 template<int N> //模板 class Fibonacci { public: enum{Result = Fibonacci<N-1>::Result + Fibonacci<N-2>::Result }; //列舉,帶有隱含計算 }; //完全特化模板 template<> class Fibonacci<1> //帶常引數1的建構函式 { public: enum { Result = 1 }; //給列舉賦初值1 }; //完全特化模板 template<> class Fibonacci<0> //帶引數0的模板 { public: enum { Result = 0 }; //給列舉賦初值0 }; int main() { std::cout << "第20項的Fibonacci數是:" << Fibonacci<20>::Result << std::endl; //隱含計算 system("pause"); return 1; }
總結:
遞迴(英語:Recursion),又譯為遞迴,在數學與電腦科學中,是指在函式的定義中使用函式自身的方法。
迭代,數學中的迭代可以指函式迭代的過程,即反覆地運用同一函式計算,前一次迭代得到的結果被用於作為下一次迭代的輸入。
使用遞迴要注意的有兩點:
1)遞迴就是在過程或函式裡面呼叫自身;
2)在使用遞迴時,必須有一個明確的遞迴結束條件,稱為遞迴出口.
遞迴分為兩個階段:
1)遞推:把複雜的問題的求解推到比原問題簡單一些的問題的求解;
2)迴歸:當獲得最簡單的情況後,逐步返回,依次得到複雜的解.
迭代:利用變數的原值推算出變數的一個新值.如果遞迴是自己呼叫自己的話,迭代就是A不停的呼叫B.
遞迴中一定有迭代,但是迭代中不一定有遞迴,大部分可以相互轉換.能用迭代的不用遞迴,遞迴呼叫函式,浪費空間,並且遞迴太深容易造成堆疊的溢位.
超程式設計(Metaprogramming)是指某類計算機程式的編寫,這類計算機程式編寫或者操縱其他程式(或者自身)作為它們的資料,或者在執行時完成部分本應在編譯時完成的工作。很多情況下比手工編寫全部程式碼相比工作效率更高。編寫元程式的語言稱之為元語言,被操作的語言稱之為目標語言。一門語言同時也是自身的元語言的能力稱之為反射。
參考文獻: