上の図から分かるように、再帰の深さはスタックのコンテキストの最大数と等しくなります。メモリ要件に注意してください。コンテキストはメモリを必要とします。小さいすべての値に対して、コンテキストのためのメモリが必要です。変化する1つのコンテキストを使います。どんな再帰もループで書き直すことができます。通常、ループのバリアントは、より効率的にすることができます。...しかし、関数が条件によって異なる再帰サブコールを使用してその結果をマージするときや、分岐がより複雑な場合には書き直しは簡単ではないことがあります。最適化は不要であり、努力に値しないものである可能性があります。再帰はより短いコードで書くことを可能とし、理解や保守をし易くします。最適化はあらゆる場所で必要とされるわけではなく、大半は良いコードが必要です。そのために再帰は使用されています。再帰のもう1つの優れた用途は、再帰的な探索です。私たちは会社を持っていると想像してください。}};言い換えると、会社は部署を持っています。部署はスタッフの配列を持っているかもしれません。部門は2人の従業員がいます。internals)を持っているように、部署はサブの部署に分割されるかもしれません。それらは各々のスタッフを持ちます。分割される可能性もあります。チームに分割されるかもしれません。それらは潜在的にさらに分割することができます。全員の給料の合計を取得する関数が欲しいとしましょう。どのようにすればよいでしょう?反復的なアプローチは簡単ではありません。構造はシンプルではないためです。ループを作ることです。第2レベルの部門のスタッフを反復するためには、より多くのネストされたサブループが必要になります。1つのオブジェクトを探索するために3〜4個のネストされたサブループをコード内に置くと、それはかなり醜いものになります。再帰でトライしてみましょう。この場合は単純なループで給料を合計することができます。回の再帰呼び出しを行ってサブ部門の各合計を取得し、結果を結合します。再帰の基底で、自明なケースです。複雑なタスクはより小さい部門のためのサブタスクに分割されます。同じオブジェクトです。6700コードは(望んだように?)短く理解しやすくなりました。これは任意のレベルのサブ部門のネスティングでも正しく動作します。あり即座に結果を返します。