答えて
はい、再帰を避けることは、すべての組み込みプラットフォームで良いことです。
スタックオーバーフローの可能性を下げるだけでなく、スタックオーバーフローの可能性も排除するだけでなく、より高速なコードも提供することがよくあります。
反復アルゴリズムを常に反復的に書き換えることができます。それは必ずしも実用的ではありません(クイックソートを考えてください)。これを回避する方法は、再帰の深さが制限されるようにアルゴリズムを書き換えることです。
イントロレーションは、どのように実際に行われたかの完全な例です。クイックソートの再帰深度をlog2(要素数)に制限します。だから、32ビットマシン上で、私は(車のエンターテイメントシステム、携帯電話、ゲーム・コンソールや、過去に組み込みプラットフォーム用のソフトウェアのかなりを書いた32
http://en.wikipedia.org/wiki/Introsort
より深いを再帰的にすることはありません私はいつも再帰の深さに上限を置くか、最初のところで再帰を避けるようにしました。
私のプログラムのどれもスタックオーバーフローで死んだことはなく、ほとんどのプログラムは32kbのスタックに満足しています。これは、各スレッドがそれ自身のスタックを取得すると、複数のスレッドが必要になると大きな時間を費やします。メガバイトのメモリをこのように節約することができます。
iphoneの最大スタックサイズは?
iPhoneは、ほとんどのオペレーティングシステムと同様に、すべてのプロセスに有効なメモリ空間が与えられている修正されたOSXを実行します。
これは完全なプロセッサーなので、スタックが成長し、ヒープが成長します(逆もまた同様です)。これは、プログラムに割り当てられたメモリが足りなくなるまでスタックをオーバーフローさせないことを意味します。
スタックとパフォーマンス上の理由から(単純なループと比較して関数呼び出しが高価な)再帰を避けるのが最善ですが、どのような場合でも再帰関数に適用できる制限を決定し、長すぎる
「再帰を使用しないでください」という沸騰の回答が2つあります。私は同意しない - それはiPhoneが厳しく制限された組込みシステムではない。問題が本質的に再帰的である場合は、そのように表現してください。
数百または数千のフレームのスタック深度に再帰しない限り、問題は発生しません。
- 1. 避け再帰
- 2. Linuxエイリアスチェーンコマンド(再帰を避けることができますか?)
- 3. 再帰を避ける
- 4. os.walkで無限再帰を避ける
- 5. 再帰(?)#include宣言を避ける
- 6. バイトバディで再帰呼び出しを避ける方法 - java.lang.StackOverflowError
- 7. C++クラステンプレートで無限再帰を避ける方法
- 8. 再帰でスタックオーバーフローを避けるためのヒント
- 9. セルの変更時にVBAで再帰を避ける
- 10. ハッシュマップで再ハッシュを避けることはできますか?
- 11. サブドメインを使用するか避けるべきですか?
- 12. PL/SQL:列を更新するときに再帰的なトリガーを避ける
- 13. React to setStateを使用して再帰を避けるには?
- 14. アクティビティクラスの外で `startActivity`を避けるべきでしょうか?
- 15. シリアライザ(angularjs)との無限再帰関係を避ける
- 16. ツリーウォークの再帰を避ける最適な方法
- 17. jquery:あまりにも多くの再帰を避ける
- 18. レルムの再帰的な変更通知を避ける
- 19. Powershellスクリプトの 'dir'エイリアスを避けるべきですか?
- 20. Python 2 + 3互換コード:6を避けるべきですか?
- 21. Monadの使用を避けるべきですか?
- 22. べき乗累乗再帰
- 23. WebサービスをiPhoneでポーリングするのを避けますか?
- 24. VBAでの再帰を避けるために明確化が必要
- 25. 弱いタイプはいつ避けるべきですか?
- 26. Redis HyperLogLogはいつ避けるべきですか?
- 27. Javaではオートボクシングを避けるべきです
- 28. カスタム列挙子で無限再帰を避けるにはどうすればよいですか?
- 29. Prolog再帰でこの落とし穴を避けるにはどうすればよいですか?
- 30. ここでPHPは無限回帰を避けますか?
(自分自身を呼び出す電話についてここに愚かなジョークを挿入します) –