問題タブ [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.
performance - 特定のシナリオでscalacが末尾再帰を最適化できないのはなぜですか?
scalac ( Scalaコンパイラ)が末尾再帰を最適化しないのはなぜですか?
これを示すコードとコンパイラの呼び出し:
scala - Scalaと末尾再帰
スタックオーバーフローには、 Scalaで末尾再帰が可能な条件を説明するさまざまな回答があります。制限と、末尾再帰を利用する方法と場所を理解しています。私が理解していない部分は、プライベートメソッドまたはfinalメソッドへの制限が存在する理由です。
Scalaコンパイラが実際に再帰関数をバイトコードレベルで非再帰関数に変換する方法については調査していませんが、次のような動作をすると仮定します。Foo
再帰関数を持つクラスがありますmod
:
これは基本的なモジュロ関数であり、Scalaコンパイラーが次のような疑似Java-Scalaに変換されると思います。
(私はその翻訳を台無しにしたと信じることができますが、詳細は重要ではないと思います。)
だから今私がサブクラスだとしましょうFoo
:
これが機能しなくなるのは何ですか?JVMにとが呼び出されたときFoo/Bar
に、使用する必要mod
のある関数の解決に問題があるのはなぜですか。mod
これは、基本関数が非再帰的である状況と異なるのはなぜですか?
これが事実であると私が見ることができるいくつかの考えられる理由は次のとおりです。
何らかの理由で、Scalaコンパイラーの実装はこれを処理しません(その場合は十分に公平です。もしそうなら、これを変更する計画はありますか?)
関数内
Foo
はコンパイル中に変更されるため、実際にはオーバーライドするメソッドはありません。mod
mod-non-recursive
Foo
mod
f# - F#のWhileまたはTail Recursionで、いつ何を使用しますか?
わかりました、F#だけで、これが私が今それを理解している方法です:
一部の問題は本質的に再帰的であり(1つだけ名前を付けるためにツリー構造を構築または読み取る)、再帰を使用します。このような場合は、末尾再帰を使用してスタックにブレークを与えることが望ましいです。
一部の言語は純粋関数であるため、問題が本質的に再帰的でない場合でも、whileループの代わりに再帰を使用する必要があります
だから私の質問:F#は命令型パラダイムもサポートしているので、自然に再帰的な問題ではない問題に対してF#で末尾再帰を使用しますか?特に私が読んだので、コンパイラは末尾再帰を認識し、とにかくそれをwhileループで変換しますか?
もしそうなら:なぜ?
functional-programming - 末尾再帰で書けない問題はありますか?
末尾再帰は、再帰呼び出しが定数スタック (O(n) ではなく) を消費できるため、関数型言語における重要なパフォーマンス最適化戦略です。
単純に末尾再帰スタイルで記述できない問題はありますか?それとも、単純再帰関数を末尾再帰関数に変換することは常に可能ですか?
もしそうなら、いつの日か関数型コンパイラとインタプリタが自動的に変換を実行できるほどインテリジェントになるでしょうか?
clojure - Clojureでのテールコールの除去?
誰かがこの (plt) スキーム コードを Clojure に書き直すことはできますか?
プロシージャ f、g、および h を一緒に折りたたまず、クラッシュすることなくコードを無期限に実行できるようにする方法は?
f# - F# でのコードの重複の回避
float リストを Vector3 または Vector2 リストに変換しようとする 2 つのコード スニペットがあります。アイデアは、リストから一度に 2/3 の要素を取得し、それらをベクトルとして結合することです。最終結果は一連のベクトルです。
コードは非常によく似ていますが、共通部分を抽出する方法がないようです。何か案は?
optimization - 関数型プログラミングでの効率的な再帰とさまざまなパラダイムでの非効率的な再帰
私の知る限り、再帰は非常にエレガントですが、OOPおよび手続き型プログラミングでは非効率的です(すばらしい「高次perl」、Mark Jason Dominusを参照)。関数型プログラミングでは再帰が高速であるという情報がいくつかありました。その優雅さとシンプルさを維持しています。誰かがこれを確認し、おそらく増幅することができますか?私はXSLTとHaskellの観点から考えています(私の次の学習言語リストの上位にあります)
ありがとう
ダニエル
ocaml - この関数は末尾再帰を使用しますか?
oCaml がこのコードを末尾再帰に最適化するかどうか疑問に思っています。そうであれば F# もそうですか?
c - 再帰的高調波関数は NaN を返します
N の高調波値 (1+1/2+1/3+...1/N) を見つけるために、次のサンプル コードを作成しました。太字で書かれたコードのコメントを読んで、なぜこのようなことが起こっているのかを見つけてください。
ありがとう、ナガ
c++ - Visual C++ テール コールの最適化
その質問への回答によると 、末尾再帰の最適化を行う C++ コンパイラはありますか? コンパイラは末尾再帰の最適化を行う必要があるようです。
しかし、提案されたオプションを試してみましたが、テンプレート関数の場合、コンパイラはこの最適化を実行できないようです。どうにかして修正できますか?