再帰関数を学ぶときにめまいを感じ、再帰関数の原理や動作メカニズムを理解できない学生も少なくありません。この記事では、再帰関数の動作メカニズムと応用について詳しく説明します。
では、再帰関数とは何ですか?
再帰関数は、関数本体内で直接または間接的に自分自身を呼び出す関数です。ただし、自己呼び出しの条件が満たされている場合は、その関数自体が呼び出されます。この関数の自己呼び出しが終了し、現在のプロセスの制御が上位層の関数に返されて実行されます。 このように説明するとわかりにくいかもしれません。
それでは、Gao Luofeng 先生の「PHP を詳しく説明する」の例を使って説明しましょう。
機能テスト($n){
エコー $n." ";
if($n>0){
テスト($n-1);
}その他{
エコー "<-->";
}
エコー $n." ";
}
テスト(10);
?>
まず考えてみましょう。この例の最終出力は何でしょうか?
それでは、この関数の出力を見てみましょう:
10 9 8 7 6 5 4 3 2 1 0 <--> 0 1 2 3 4 5 6 7 8 9 10
結果は皆さんの期待通りだったでしょうか?
それでは、順を追って説明しましょう...
最初のステップは test(10) を実行し、echo 10 を実行し、次に 10>0 であるため test(9) を実行しますが、時間内に実行されていない echo 10 がまだ存在します
2 番目のステップは、テスト (9)、エコー 9 を実行し、次に 9>0 であるため、テスト (8) を実行します。また、時間内に実行されていないエコー 9 もあります
3 番目のステップは、test(8)、echo 8 を実行し、その後、8>0 であるため、test(7) を実行します。これには、時間内に実行されていない echo 8 もあります。
4 番目のステップは、テスト (7) を実行し、エコー 7 を実行します。その後、7>0 であるため、テスト (6) を実行しますが、時間内に実行されていないエコー 7 もあります。5 番目のステップは、テスト (6)、エコー 6 を実行し、その後 6>0 であるため、テスト (5) を実行します。これには、時間内に実行されていないエコー 6 もあります。
......ステップ 10、test(0)、echo 0 を実行します。この時点では、0>0 の条件は満たされていませんが、test() 関数は実行されませんが、echo "<-->" と、後続の echo 0 が実行されます
10 9 8 7 6 5 4 3 2 1 0 <--> 0 1 2 3 4 5 6 7 8 9 10
このときの出力内容は上図の赤い部分のようになります
この時点で関数は自分自身を呼び出すことはなくなり、上層の関数に処理の制御を返して実行を開始します。
つまり、すべての test() 関数が出力する前に実行が開始された最後のエコーです
プロセスは次のとおりです:
関数実行の最初から 10 番目のステップでは、関数は緑色の部分を出力します。赤色の部分がまだ出力されていない場合は、関数自体を呼び出して操作を実行し、プロセスが実行されるまで続けます。自身を呼び出すための条件が満たされなくなった場合、「<-->」が出力されます。このとき、プロセスは以前に「間に合わなかった」によって出力されたコードを実行する必要があります。
すべてのテスト関数を実行した後、最終的に 0 が出力されました。
つまり、ここに出力します
10 9 8 7 6 5 4 3 2 1 0 0
では、次の出力が 10 ではなく 1 になるのはなぜですか
この問題について、皆さんが理解しやすいように、別の例を挙げてみましょう:
次のコードを見てください:
関数 1($num){
エコー $num;
2($num-1);
エコー $num;
}
関数 2($num){
エコー $num;
3($num-1);
エコー $num;
}
関数 3($num){
エコー $num;
}
1(3);
?>
上記のコードは test() 関数を分解します:
one(3) 関数を実行するときは、test() 関数と同様に、最初に 3 を出力し、次に two(2) 関数を呼び出します。
現時点では以下の3つは出力されていないことに注意してください
次に、two(2)関数を実行して2を出力し、同様に次の2を出力する時間がありません
。
他の関数を呼び出さずに、three(1) を実行して 1 を直接出力します。
このとき、two()関数がまだ実行されていないだけなのではないかと思いますが、two()関数の未完了部分を実行すると、以下の2が出力されます。実行を開始します () 実行されていない関数の部分は、以下の 3 の出力です。この時点で、すべての関数が実行されています。
出力結果は次のようになります:
3 2 1 2 3
どうでしょうか、こう言った方が皆さん分かりやすいでしょうか?
それでも理解できない場合は、以下に質問を残していただき、貴重なご提案をいただければ、対応する改善と説明をさせていただきます。