1. 程式人生 > >Fibonacci series(斐波納契數列)的幾種常見實現方式

Fibonacci series(斐波納契數列)的幾種常見實現方式

費波那契數列的定義:

義大利語:Successione di Fibonacci),又譯費波拿契數斐波那契數列斐波那契數列黃金分割數列

數學上,費波那契數列是以遞迴的方法來定義:

  • F_0=0
  • F_1=1
  • F_n = F_{n-1}+ F_{n-2}(n≧2)

用文字來說,就是費波那契數列由0和1開始,之後的費波那契係數就由之前的兩數相加。

首幾個費波那契係數是:01123581321345589144233……

特別指出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)是指某類計算機程式的編寫,這類計算機程式編寫或者操縱其他程式(或者自身)作為它們的資料,或者在執行時完成部分本應在編譯時完成的工作。很多情況下比手工編寫全部程式碼相比工作效率更高。編寫元程式的語言稱之為元語言,被操作的語言稱之為目標語言。一門語言同時也是自身的元語言的能力稱之為反射

參考文獻: