問題タブ [tail-recursion]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
algorithm - 末尾再帰とは
Lisp を学び始めているときに、末尾再帰という用語に出くわしました。正確にはどういう意味ですか?
c++ - 末尾再帰の最適化を行う C++ コンパイラはどれですか?
C と C++ の両方で末尾再帰の最適化を行うと完全にうまくいくように思えますが、デバッグ中に、この最適化を示すフレーム スタックが表示されないようです。スタックが再帰の深さを教えてくれるので、これは良いことです。ただし、最適化も同様に優れています。
この最適化を行う C++ コンパイラはありますか? なんで?なぜだめですか?
コンパイラにそれを行うように指示するにはどうすればよいですか?
- MSVC の場合:
/O2
または/Ox
- GCC の場合:
-O2
または-O3
特定のケースでコンパイラがこれを行ったかどうかを確認するのはどうですか?
- MSVC の場合、PDB 出力を有効にしてコードをトレースできるようにしてから、コードを検査します。
- GCCの場合..?
特定の関数がコンパイラによってこのように最適化されているかどうかを判断する方法については、引き続き提案を行います(Konradがそれを想定するように指示してくれたので安心しましたが)
無限再帰を作成し、無限ループまたはスタック オーバーフローが発生するかどうかを確認することで、コンパイラがこれを行うかどうかを常に確認できます (GCC でこれを行い、それで-O2
十分であることがわかりました)。とにかく終了することがわかっている特定の機能を確認できます。これを簡単に確認する方法があれば幸いです:)
いくつかのテストの後、デストラクタがこの最適化を行う可能性を台無しにすることを発見しました。特定の変数と一時変数のスコープを変更して、return ステートメントが開始される前にそれらが確実にスコープ外になるようにすることは、価値がある場合があります。
末尾呼び出しの後にデストラクタを実行する必要がある場合、末尾呼び出しの最適化は実行できません。
java - JVM は末尾呼び出しの最適化を防止しますか?
Web サービスを構築するのに適した関数型言語は何ですか?という質問に関するこの引用を見ました。
特に Scala は、実行できる構成の種類を制限する自己再帰関数を除き、末尾呼び出しの削除をサポートしていません (これは JVM の基本的な制限です)。
これは本当ですか?もしそうなら、この根本的な制限を生み出すのは JVM について何ですか?
algorithm - テールコール最適化とは?
非常に簡単に言えば、テールコール最適化とは何ですか?
より具体的には、適用できる小さなコード スニペットと、適用できない小さなコード スニペットと、その理由の説明を教えてください。
haskell - Haskell の末尾再帰はどのように機能しますか?
私はこのコード スニペットを書きました。これlen
は末尾再帰だと思いますが、スタック オーバーフローは依然として発生します。なにが問題ですか?
lisp - リストの長さを計算するためのテール最適化関数の最良のアプローチは何ですか?
これはフォーラムの投稿者が示した例です。このテールが最適化されているかどうかはわかりません。また、テールを最適化したバージョンが通常のバージョンよりも優れている方法について、素人の説明を誰かが与えることができますか.
テール最適化されていないバージョンですか?
gcc - gcc が末尾再帰の最適化を実行しているかどうかを確認するにはどうすればよいですか?
gcc (より具体的には g++) が特定の関数で末尾再帰を最適化しているかどうかを確認するにはどうすればよいですか? (何度か出てきたので: gcc が一般に末尾再帰を最適化できるかどうかをテストしたくありません。末尾再帰関数が最適化されるかどうかを知りたいです。 )
あなたの答えが「生成されたアセンブラを見てください」である場合、探しているものを正確に知りたいのですが、アセンブラを調べて最適化があるかどうかを確認する簡単なプログラムを作成できるかどうかを知りたいです。
PS。これは、末尾再帰の最適化を行う C++ コンパイラがあるとすれば、それはどれですか? 5ヶ月前から。しかし、その質問のこの部分は十分に答えられたとは思いません。(答えは、「コンパイラが最適化を行ったかどうかを確認する最も簡単な方法(私が知っている)は、そうでなければスタックオーバーフローを引き起こす呼び出しを実行するか、アセンブリ出力を調べることです。」)
c# - .NET/C# が末尾呼び出し再帰を最適化しないのはなぜですか?
末尾再帰を最適化する言語に関するこの質問を見つけました。C# が末尾再帰を可能な限り最適化しないのはなぜですか?
具体的なケースとして、このメソッドがループに最適化されていないのはなぜですか (問題がある場合、 Visual Studio 2008 32 ビット)。
iphone - iPhoneで再帰を避けるべきですか?
iPhone で実行されるコードで再帰を避けるべきですか?
または別の言い方をすれば、iPhoneの最大スタックサイズを知っている人はいますか?
algorithm - 再帰を理解する
学校で再帰を理解するのに大きな問題があります。教授がそれについて話しているときはいつでも、私はそれを理解しているように見えますが、自分で試してみるとすぐに、頭が完全に吹き飛ばされます.
私は一晩中ハノイの塔を解こうとしていたのですが、完全に頭がおかしくなりました。私の教科書は再帰で約 30 ページしかないので、あまり役に立ちません。このトピックを明確にするのに役立つ本やリソースを知っている人はいますか?