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