反復を使用するすべての問題は反復を使用して解決できますが、再帰を使用して問題を解決できると思いますか?再帰は常に反復を代用できますか?可能であれば、答えに証拠を提示してください。無限のスタックがあると仮定するか、チューリングマシンでプログラムを実行します。私はこの証拠が理論的証拠であるかどうかは気にしない。 (これが私がチューリングマシンに言及した理由です)再帰と反復
再帰と反復
答えて
はい、再帰は常に反復を置き換えることができます。これについては、beforeで説明しました。リンクされたポストからの引用:
厳密な反復構造と再帰構造のみを使用した完全な言語を使用してチューリング完全言語を構築できるため、2つは同等です。
ビットを説明する:計算可能な問題はチューリングマシンで解決できることがわかりました。また、再帰なしでプログラミング言語A
を構築することも可能です。これはチューリングマシンと同等です。同様に、プログラミング言語B
を反復せずに作成することも可能で、計算能力はチューリングマシンと同等です。
したがって、A
とB
の両方がTuring-completeである場合、任意の反復プログラムでは等価な再帰プログラムが存在しなければならないと結論付けることができます。これは理論上の結果です。つまり、任意の反復プログラムから1つの再帰プログラムを派生させる方法のヒントは得られません。逆もまた同様です。
このリンクを見逃してしまった –
はい。 tail recursionと呼ばれる再帰のタイプがあります。これは、繰り返しに直接変換できます。 1つは問題なく他のものに変換できます。したがって、すべての反復解を再帰解に変換することができます。
実際、多くのコンパイラは、末尾再帰を実行していることを検出して、それを効率のためにforループ型コードに変換できます。
ループが不要な場合に再帰を使用する必要がありますが、その方法は特定のケースで繰り返しなければなりません。たとえば、フォルダを圧縮します。サブフォルダがある場合は、それ自体を呼び出す必要があります(再帰的)。あなたが望むなら、再帰は反復を置き換えることができますが、推薦されません。ほとんどの人は反復を使用して、必要なときだけ再帰を使用します。
- 1. 再帰、テール再帰と反復
- 2. XSLT反復または再帰のパフォーマンス
- 3. リスト/配列を再帰的に反復する
- 4. 反復メソッドを再帰的メソッド(Java)に変換する方法
- 5. Pythonでこの再帰関数を反復する方法は?
- 6. アルファベットを再帰的に反復するには?
- 7. 動的プログラミング再帰的または反復的
- 8. MIPSコードの再帰的反復文字列の複雑さ
- 9. プロミスイテレータを反復する非再帰的メソッド
- 10. 再帰関数のjavascriptの復帰
- 11. 非反復乱数のための再帰ループと整数配列の使用
- 12. 再実行ループ反復
- 13. 再帰アルゴリズムを反復アルゴリズムに変換するのが難しい
- 14. このメソッドを再帰的から反復的に変換する
- 15. 再帰はいつ、なぜ反復よりもパフォーマンスが悪いのですか?
- 16. 反復関係から再帰ツリーの高さを決定する方法は?
- 17. ネストした再帰関数の束を反復関数に変換
- 18. 反復とStringify_keys
- 19. 反復と再帰を使用して階乗を計算するときの回答が異なります
- 20. GTK#とPixbufAnimation反復
- 21. Pythonクラスと反復
- 22. HAMLと反復XML
- 23. 反復アプローチとLINQ
- 24. Scheme - バイナリツリー反復再帰は、何もではなく空のNodeとしてappends()を追加します。
- 25. テーブルからのデータの再帰的または反復的な取り出し - 系図として
- 26. ビジターパターンと再帰
- 27. 再帰doT.jsと
- 28. 再帰とStackOverflowError
- 29. ポインタと再帰
- 30. LINQと再帰
誰かがここで私を修正するかもしれませんが、いくつかの言語(純粋に関数型言語)ではありません*再帰に完全に基づいて*?例えばLisp言語? –
@TonyR Lisp言語はまったく機能的ではありません。 –
それでは "機能言語"はどうですか? –