* F0 = 0
* F1 = 1
* Fn = Fn - 1 + Fn - 2 (n > 1)
對電算概論而言,斐波那契數列則時常用來解釋遞迴(recursion)的概念。舉例來說,以下是以遞迴實現斐波那契數列的虛擬碼:
int Fibonacci(Index n)
{
if (n = 0) { return 0; }
else if (n = 1) { return 1; }
else
{
return Fibonacci(Index - 1) + Fibonacci(Index - 2);
}
}
不過,這種方式雖然直覺而且簡單,但是其執行效率卻相當差。因為在需要求出 Fn (n > 1) 值的同時,我們也必須得到 Fn - 1 與 Fn - 2 的值。而為了得出 Fn - 1 的值,又必須再重複求出 Fn - 2 的值。
不斷重複求出同樣的值的結果,就是浪費太多的程式時間。因此只要 n 大到一個程度,程式就幾乎無法在短時間內得出結果了。
那麼,還有什麼方法呢?
其實我們可以使用陣列搭配迴圈來做到。請看以下虛擬碼:
void Fibonacci(Index n)
{
Index i;
F[0] = 0;
F[1] = 1;
for (i = 2 to n)
{
F[i] = F[i - 1] + F[i - 2];
}
print F[n];
}
我們也可以只利用三個變數來達成相同功能。請看以下虛擬碼:
void Fibonacci(Index n)
{
if (n = 0) { return 0; }
else if (n = 1) { return 1; }
else
{
Index i;
F[0] = 0;
F[1] = 1;
for (i = 2 to n)
{
F[2] = F[0] + F[1];
F[0] = F[1];
F[1] = F[2];
}
print F[3];
}
}
至於程式語言的實作,由於之前在 96 學年度北市高中資訊競賽的會議中心 (Room)已經寫過,這裡就不重複貼出了。
0 回覆:
張貼留言