再帰的なプログラムは内部でスタックを作成し、ユーザーが書くコードを減らします。
上記以外の理由で、手動スタックよりも再帰が実際に好まれるケースはありますか?
編集1:
動的メモリ割り当ては、再帰プログラムによるヒープへの割り当てよりもどのように「高価」ですか?
再帰的なプログラムは内部でスタックを作成し、ユーザーが書くコードを減らします。
上記以外の理由で、手動スタックよりも再帰が実際に好まれるケースはありますか?
動的メモリ割り当ては、再帰プログラムによるヒープへの割り当てよりもどのように「高価」ですか?
「コードが少ない」と言ったときにほのめかしている主な理由は、デザインの明快さとシンプルさです。ローカル変数や自動ストレージなどの機能を備えた言語では、すべてをホームロールスタックに構造化するよりも、これらの機能を使用する方がはるかに自然です。(結局のところ、なぜ関数を使用するのですか?if
/else
を使用してプログラム全体を記述while
し、唯一の制御構造として使用しないのはなぜですか?)
もう1つの考慮事項は、特にマルチスレッド環境でのパフォーマンスです。再帰—言語によっては—スタックを使用する可能性があります(注:「内部でスタックを作成する」と言いますが、実際には、そのような言語のプログラムが常に持つスタックを使用します)が、手動スタック構造には動的メモリが必要です割り当て。これには、パフォーマンスが著しく低下することがよくあります。例外が発生したときに、すべてのメモリを確実に解放するという複雑さが増すことは言うまでもありません。
私は@ruakhの答えにほとんど同意します。システムスタックを使用すると多くのオーバーヘッドが発生し(実際には、再帰するたびに必要以上の状態をプッシュしている)、非常に深い(しかし制限された)再帰でスタックオーバーフローが発生する可能性があることを付け加えておきます。明示的なスタックを使用し、必要な状態のみをプッシュすることで回避します。