製品品質の VC++ コードを記述する場合、再帰の使用は許容されますか? なぜですか、そうでないのですか?
5 に答える
どの時点でスタック オーバーフローが発生するかを判断する方法はありますか?
あまり。スタック スペースを使い果たすとスタック オーバーフローが発生しますが、...
- 初期スタック サイズはプログラムで変更でき、OS/コンパイラ/etc に応じて異なる量にデフォルト設定される場合があります。
- すでにどれだけ使用されているかは、アプリ (およびアプリが使用するライブラリ) が以前に行ったことによって異なります。これは多くの場合、予測が不可能です。
- 各呼び出しに必要なスタックの量は、関数で何を行うかによって異なります。スタックに 1 つの整数のみを割り当てた場合、膨大な回数の再帰を実行できる可能性がありますが、スタックに 200k のバッファーを割り当てている場合は、それほど多くはありません。
私がこれまでにヒットしたのは、無限ループであるか、前述の 200k バッファーを使用したときだけです。
アプリが 100% の CPU を使用して永久にループし、強制的に強制終了するよりも、アプリがクラッシュする方がはるかに好ましいと思います (これは、Windows に SSH がないため、接続不良を介したリモート サーバー上の正しい PITA です)。
大まかなガイドライン: あなたの再帰関数は、自分自身を 10,000 回以上連続して呼び出す可能性が高いと思いますか? それとも、スタックに 200k のバッファを割り当てるような愚かなことをしていますか?
もしそうなら、心配してください。
いいえの場合は、より重要なことを続けてください。
はい。しかし、決してデッドコードではありません。それはばかげているでしょう。
確かに - たとえば、ツリー構造をトラバースしたい場合、他に何を使用しますか?
無限ループを作成していないことを確認するために、最大深度のようなものが必要になる場合があります。(これがあなたの例で意味がある場合)
どの時点でスタック オーバーフローが発生するかを判断する方法はありますか?
あなたがどれだけ深く行くか、そして実際の再帰がどれだけ大きいかによって異なります。再帰が何をするのか理解できたと思いますか?
フォルダー/ディレクトリなどのファイル構造をトラバースするには、再帰がほぼ不可欠です。
再帰を使用すると、ツリーのような構造をトラバースするのは非常に簡単です。