[解決済み] 再帰と反復
2022-07-23 15:37:30
質問
再帰が使われるところではどこでも
for
ループが使用される可能性があるというのは正しいでしょうか。また、もし再帰が通常より遅いのなら、それを
for
ループの反復を使用する技術的な理由は何ですか?
また、もし再帰を常に
for
ループに変換できるのであれば、それを行うための経験則はあるのでしょうか?
どのように解決するのですか?
再帰処理は、呼び出し元の関数に戻るために、すべての関数呼び出しをスタックに格納する必要があるため、通常、非常に遅くなります。多くの場合、スコープアイソレーションを実装するために、メモリを割り当てたりコピーしたりする必要があります。
いくつかの最適化、たとえば テールコールの最適化 のように、再帰を高速化する最適化もありますが、常に可能とは限りませんし、すべての言語で実装されているわけではありません。
再帰を使用する主な理由は以下の通りです。
- 問題のアプローチを模倣する場合、多くの場合においてより直感的であること
- 木のようないくつかのデータ構造は、再帰を使用して探索する方が簡単であること (あるいは、どのような場合でもスタックが必要であること)
もちろん、すべての再帰は は は一種のループとしてモデル化することができます。そして再帰そのものは、より直接的には、関数呼び出しとスコープをスタックに置くことを意味します。しかし、再帰アルゴリズムをループするものに変更するには多くの作業が必要で、コードの保守性が低下するかもしれません。すべての最適化について、プロファイリングまたは証拠によってそれが必要であることが示された場合にのみ、それを試みる必要があります。
関連
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Quickselectの時間の複雑さを説明する
-
[解決済み】whileループの時間複雑性とは?
-
[解決済み] 最小スパニングツリーは負の重みを恐れているのか?
-
[解決済み] Octave : ロジスティック回帰 : fmincg と fminunc の違い
-
[解決済み] 2つのNFAの交点の求め方
-
[解決済み] ヒープ構築のトップダウン・アプローチはボトムアップよりも成長度合いがO(n)よりもO(log n)低いにもかかわらず、なぜ効率が悪いのでしょうか?
-
[解決済み] T = {<M> | Mはwを受け入れるときはいつでも$w^R$を受け入れるTMである}とする。Tが決定不可能であることを示せ
-
[解決済み] 整数の絶対値の計算方法
-
[解決済み] あるアルゴリズムの計算量がO(log log n)になる原因は何でしょうか?
-
[解決済み】すべての再帰は反復に変換できる?