C 語言快速導覽 - 遞迴函數

C 語言的函數中除了可以呼叫其他函數,也可以呼叫自己,呼叫自己的函數被稱為遞迴函數。



以下將函數的定義介紹的指數函數改成用遞迴來寫
#include <stdio.h>

int exponent2(int , int);

int main(void)
{
    int i;
    
    for (i = 0; i <= 10; i++) {
        printf("%2d%5d\n", i, exponent2(2, i));
    }
    
    return 0;
}

int exponent2(int a, int x)
{
    if (x == 0) {
        return 1;
    }
    else {
        return a * exponent2(a, x - 1);
    }
}

/* 《程式語言教學誌》的範例程式
    http://pydoing.blogspot.com/
    檔名:exponent3.c
    功能:測試遞迴指數函數,從 2 的 0 次方列印到 10 次方
    作者:張凱慶
    時間:西元2010年4月 */


編譯然後執行,結果如下



遞迴的計算分成初始條件與遞迴條件,指數函數中的初始條件便是當指數為 0 的時候,所得的指數函數值為 1 ,程式的第 18 到 20 行便是初始條件的部份。
if (x == 0) {
    return 1;
}


所謂的遞迴條件就是如何把計算拆成相同的重複步驟,問題用相同的條件還原成更早的問題,直到符合初始條件為止。這樣一來,每一次都可以利用呼叫遞迴函數本身進行計算,程式的第 21 到 23 行便是遞迴條件,每一次呼叫都是底數 a 乘上指數 x 減 1 的函數 exponent2() 。
else {
    return a * exponent2(a, x - 1);
}



由此,遞迴程式會進行堆疊的動作,把每一次的呼叫都放到堆疊之中,直到運算到初始條件之後,再把堆疊之中儲存的值的逐一取出依次計算。





沒有留言: