先頭へ戻る

再帰呼び出し | Programming Place Plus 用語集

Programming Place Plus トップページ -- 用語集

先頭へ戻る

名称


解説

あるプロシージャの中で、そのプロシージャ自身を呼び出すことです。

プロシージャ(手続き)とは、何らかの処理を行うために必要なソースコードをひとまとめにしたもののことで、関数メソッドサブルーチンと呼ばれるものが該当します。

再帰呼び出しが可能かどうかはプログラミング言語の仕様によりますが、ほとんどの言語で許されています。ただし、再帰呼び出しが可能であるとしても、正しく動作するかどうかはプロシージャのつくり次第であり、少なくとも、そのプロシージャがリエントラント(再入可能)でなければなりません。たとえば、プロシージャ内で静的変数を使っていると、毎回の再帰呼び出しが同じ静的変数を参照していることになるので、後続の呼び出し時に以前の呼び出しの状態を変化させてしまうなどして、正しい動作にならない可能性があります。

次のコードは架空のプログラミング言語での再帰呼び出しの例です。

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 でシェア
Twitter でツイート Twitter をフォロー LINE で送る
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー