★関数(再帰呼び出し2)★


前回のプログラムでは、再帰呼び出しから抜け出すことが出来ませんでした。

では、呼び出しをコントロールするにはどうすれば良いでしょうか。

呼び出された関数の中で、自分自身を呼び出すことを止めれば良いのですが、とりあえず一例を書いてみます。

<sample program 148-01>

#include <stdio.h>

void ShowValue(const int value);

int main(void)
{
    ShowValue(5);

    return 0;
}

void ShowValue(const int value)
{
    printf("value = %d\n", value);

    if (value > 0) {
        ShowValue(value - 1);
    }
}

<実行結果>

value = 5
value = 4
value = 3
value = 2
value = 1
value = 0
続行するには何かキーを押してください・・・

このプログラムでは、最初ShowValue関数に「5」を渡しています。

関数内で「5」を表示した後に、valueが0より大きい場合、自分自身を呼び出します。

ただ、呼び出す際にvalueを1減らして呼び出しています。

2度目に呼び出されたShowValue関数は「4」を受け取っています。

「4」を表示した後で、valueをさらに1減らして自分自身を呼び出します。

これを繰り返すことで、valueが0になるまで自分自身を呼び出しますが、0になってからは自分自身を呼び出すことは無くなります。


くどくなりますが、時系列で実行順番を書いていきますね。

  1.main関数からShowValue(1回目:引数5)が呼び出され、戻り場所1が記録される。

  2.「5」を表示した後に、ShowValue関数(2回目:引数4)が呼び出され、戻り場所2が記録される。

  3.「4」を表示した後に、ShowValue関数(3回目:引数3)が呼び出され、戻り場所3が記録される。

  4.「3」を表示した後に、ShowValue関数(4回目:引数2)が呼び出され、戻り場所4が記録される。

  5.「2」を表示した後に、ShowValue関数(5回目:引数1)が呼び出され、戻り場所5が記録される。

  6.「1」を表示した後に、ShowValue関数(6回目:引数0)が呼び出され、戻り場所6が記録される。

  7.「0」を表示した後は、ShowValue関数は呼び出されず、6回目の実行を終える。

  8.戻り場所6を使って5回目のShowValue関数に戻り、5回目の実行を終える。

  9.戻り場所5を使って4回目のShowValue関数に戻り、4回目の実行を終える。

  10.戻り場所4を使って3回目のShowValue関数に戻り、3回目の実行を終える。

  11.戻り場所3を使って2回目のShowValue関数に戻り、2回目の実行を終える。

  12.戻り場所2を使って1回目のShowValue関数に戻り、1回目の実行を終える。

  13.戻り場所1を使ってmain関数に戻る。

内部ではこのように実行されています。

関数の呼び出しが増えれば、戻り場所の記録場所(スタック)が消費され、メモリを圧迫するのがイメージ出来たでしょうか?

次からは少しずつ意味のあるプログラムを紹介しましょう。


次へ

戻る

目次へ