前回のプログラムでは、再帰呼び出しから抜け出すことが出来ませんでした。
では、呼び出しをコントロールするにはどうすれば良いでしょうか。
呼び出された関数の中で、自分自身を呼び出すことを止めれば良いのですが、とりあえず一例を書いてみます。
<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関数に戻る。
内部ではこのように実行されています。
関数の呼び出しが増えれば、戻り場所の記録場所(スタック)が消費され、メモリを圧迫するのがイメージ出来たでしょうか?
次からは少しずつ意味のあるプログラムを紹介しましょう。