あるプロシージャの中で、そのプロシージャ自身を呼び出すことです。
プロシージャ(手続き)とは、何らかの処理を行うために必要なソースコードをひとまとめにしたもののことで、関数やメソッド、サブルーチンと呼ばれるものが該当します。
再帰呼び出しが可能かどうかはプログラミング言語の仕様によりますが、ほとんどの言語で許されています。ただし、再帰呼び出しが可能であるとしても、正しく動作するかどうかはプロシージャのつくり次第であり、少なくとも、そのプロシージャがリエントラント(再入可能)でなければなりません。たとえば、プロシージャ内で静的変数を使っていると、毎回の再帰呼び出しが同じ静的変数を参照していることになるので、後続の呼び出し時に以前の呼び出しの状態を変化させてしまうなどして、正しい動作にならない可能性があります。
次の例は、架空のプログラミング言語で再帰呼び出しを行うものです。
void f(int x)
{
if (x <= 0) return;
print x;
f(x - 1); // 再帰呼び出し
}
C言語による解説が、C言語編第53章にあります。
再帰呼び出しを使うときには、何らかの工夫をしなければ、呼び出しが無限に続いてしまいます。この例では、再帰呼び出しのたびに引数 x の値を -1 しており、また、冒頭でその値が 0以下かどうかを確認しています。x の値が 0以下の場合はただちにプロシージャから抜け出し、それ以上の再帰呼び出しをしないようにしてあります。
再帰呼び出しの連鎖が非常に多くなったり、無限に続いてしまったりすると、コールスタックの領域が足りなくなるスタックオーバーフローという状態に陥ることがあります。スタックオーバーフローが起きると、ほかの用途で使われているメモリ領域の内容を破壊してしまったり、実行時エラーで停止したりする可能性があります。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |