再帰関数呼出し


関数呼出しと局所変数の話が分かったところで、 今度は再帰関数呼び出しの場合を考えてみましょう。 とりあえず、簡単な階乗計算(コード)の場合を考えましょう。

int fact(int n) {
    if(n <= 1) {
        return 1;
    } else {
        int pre = fact(n - 1);
        int result = n * pre;
        return result;
    }
}

int main(int argc, char** argv) {
    int result = fact(10);
    printf("fact(10) = %d\n", result);
    return 0;
}
さて、gdb でプログラムをしばらく step 実行してみましょう。 で、呼び出し関係が深くなったところで、スタックを眺めると例えばこんな感じです。

当然と言えば当然なんですが、 n, pre, result といった局所変数は、 各関数呼出しのフレーム毎に存在します。 C では、関数呼び出しの際は、その値がコピーされ、呼び出された関数の引数(局所変数でもある)として扱われます。 だから、各関数の n は違う値なのです。

これも、必ず debugger で、実行の様子や、関数の呼び出し関係、局所変数の関係を確認しましょう。


2001.11.04/ Tomio KAMADA: kamada@cs.kobe-u.ac.jp