再帰呼び出し

再帰呼び出しはサブプロシージャーの場合にだけ使用することができます。 再帰呼び出しとは、プロシージャー A がそれ自身を呼び出すか、ある いはプロシージャー B を呼び出し、プロシージャー B がそれから再び プロシージャー A を呼び出す呼び出しです。 各再帰呼び出しによって、プロシージャーの新しい呼び出しが呼び出しスタックに入 れられることになります。 新しい呼び出しには自動記憶域のすべてのデータ項目に対し 新しい記憶域があり、その記憶域は局所的なために他の呼び出しでは使用 できません (定義に STATIC キーワードを指定しないかぎり、サブプロシージャーで定義さ れるデータ項目は自動記憶域を使用します)。 早い方の呼び出しに 関連した自動記憶域は後からの呼び出しに影響されないことにも注意して ください。

呼び出しスタックにあるメイン・プロシージャーは、その呼び出し元に戻るまで呼 び出すことはできません。 したがって、既に活動中のメイン・プロシージャーを呼び出す可能性のある プロシージャーを呼び出さないように注意してください。

不注意に再帰呼び出しに至る状況を避けてください。例えば、図 60 に 示すように、3 つのモジュールがあるとします。

図 60. それぞれがサブプロシージャーをもつ 3 つのモジュール
それぞれがサブプロシージャーをもつ 3 つのモジュール

モジュール X のプロシージャー A はモジュール Y の プロシージャー B を呼び出すプログラムを実行しているとします。プロシージャー B があるフィールドを処理するということ以外、B が何を するか分かりません。 一方、プロシージャー B はプロシージャー C を呼び出し、C はプロシージャー A を 呼び出します。プロシージャー C がプロシージャー A を呼び出すと、再帰呼び出しになります。 呼び出しスタックの順序は図 61 に示すとおりです。最新の呼び出しスタック項目が最下部にあることに注意してください。

図 61. 避けるべき再帰呼び出しスタック
避けるべき再帰呼び出しスタック

サブプロシージャーは再帰的に呼び出されることが可能ですので、再帰が起こっているこ とに気付かない場合には、システム資源を使い果たすことがあります。

注意!

無条件再帰呼び出しを使用すると無限再帰の状態になり、システム資源の過剰使用につながる可能性があります。 無限の再帰は適切なプログラミングで避けることができます。 一般に、適切な再帰的プロシージャーは、望ましい結果が得られたか どうかを判別するテストで開始されます。 必要な結果が得られていれば、再帰プロシージャーは 最新の呼び出し元に戻ります。