迭代的方案雖然有其優點,問題是迭代並非顯而易見的,例如計算階層數,我們該怎麼把計算都濃縮在一個迴圈之中呢?
因為每一個階層數都是從 1 開始相乘,因此我們可以設定迴圈變數 i 從 1 開始遞增,然後另外用一個儲存算結果的變數 result ,把 result 乘上每一個遞增的 i 。
基於這個想法,程式如下
#include <stdio.h>
int factorial(int n);
int main(void)
{
int i;
for (i = 0; i < 10; i++) {
printf("%d! = %d\n", i, factorial(i));
}
return 0;
}
int factorial(int n)
{
int i, result;
result = 1;
for (i = 1; i <= n; i++) {
result *= i;
}
return result;
}
/* 《程式語言教學誌》的範例程式
http://pydoing.blogspot.com/
檔名:iterative1.c
功能:計算階層
作者:張凱慶
時間:西元2010年7月 */編譯後行,結果如下

結果符合預期,因此計算階層數可以用這個方法代替。
那計算費伯納西數可以用怎麼樣的迭代方法計算呢?由於每個費伯納西數都是前兩個數字相加,因此迴圈變數在實際計算過程就只代表要做幾次計算,這也是說,我們需要額外的兩個變數來儲存要進行相加的前兩個數字。
以下程式為計算費伯納西數的迭代版本,變數 a 及變數 b 分別儲存費伯納西數列的起始值 0 及 1 ,然後 result 儲存結果,初值設為 1 ,這樣的計算結果會跟遞迴版本相同
#include <stdio.h>
int fabonacii(int n);
int main(void)
{
int i;
for (i = 0; i < 16; i++) {
printf("F%d\t= %d\n", i, fabonacii(i));
}
return 0;
}
int fabonacii(int n)
{
int i, result, a, b;
a = 0;
b = 1;
result = 1;
for (i = 0; i < n; i++) {
result = a + b;
a = b;
b = result;
}
return result;
}
/* 《程式語言教學誌》的範例程式
http://pydoing.blogspot.com/
檔名:iterative2.c
功能:計算費伯納西數列
作者:張凱慶
時間:西元2010年7月 */編譯後執行,結果如下

問題與討論
- 比較迭代跟遞迴的優劣。
- 計算階層數時,迴圈變數為什麼不從 0 開始遞增?
- 計算費伯納西數時,如果 result 的初值設為 0 ,會有什麼結果?
2 則留言:
您好
這兩張圖似乎錯置了
第一張比較像費波納契數列
第二張是階乘數
圖弄反了,已修改,感謝指正 ^_^
張貼留言