Scalaは末尾再帰の最適化をサポートしていますか?Scalaは末尾再帰の最適化をサポートしていますか?
答えて
他のポスターが言っているように、Scalaはコンパイル時にテール再帰の最適化を行います。つまり、テール再帰関数を実行しているときにスタックトレースからわかるように、テール再帰関数はコンパイラによってループに変換されます(メソッド呼び出しはジャンプに変換されます)。
def boom(n: Int): Nothing = if(n<=0) throw new Exception else boom(n-1)
boom(10)
をし、スタックトレースを調べる:
は、次のスニペットを試してみてください。関数boomへの呼び出しは1つしか表示されないため、コンパイルされたバイトコードは再帰的ではありません。
implement tail calls at the JVM levelに浮かぶ提案があります。私の意見では、JVMはコードのコンパイル時の最適化ではなく実行時の最適化を行うことができます。再帰。基本的にはtailcall invoke
は通常のメソッドinvoke
とまったく同じように動作しますが、安全なときに呼び出し側のスタックを削除します。JITの仕様では、スタックフレームを保存する必要があるため、静的コード分析を行う必要があります。スタックフレームが決して使用されないかどうかを調べる。
現在のステータスはproto 80%です。私はそれがJava 7(invokedynamic
がより優先順位が高く、実装がほぼ完了している)に間に合うとは思わないが、Java 8では実装されているかもしれない。
"機能が自己再帰的である非常に単純なケースでのみ":これは、継続を使用するとスタックスペースが使い尽くされやすいことを意味しますか? – Giorgio
@Giorgio:はい.. –
スカラ2.7.xは、最終的なメソッドとローカル関数の自己再帰(自己を呼び出す関数)のテールコール最適化をサポートしています。
スカラ2.8には、相互に再帰的な機能を最適化する技術であるtrampolineのライブラリサポートも付属しています。
Scala再帰の状態に関する多くの情報は、Rich Dougherty's blogにあります。
モナドトランポリンについて:http://apocalisp.wordpress.com/2011/10/26/tail-call-elimination-in-scala-monads/ – Vadzim
スカラ座2.8では、あなたは、コンパイラが最適化を願って特定のメソッドをマークする@tailrec
を使用することができます。
import scala.annotation.tailrec
@tailrec def factorialAcc(acc: Int, n: Int): Int = {
if (n <= 1) acc
else factorialAcc(n * acc, n - 1)
}
の方法は、あなたが警告を受ける最適化することができない場合。
"import scala.annotation.tailrec"でアノテーションをインポートする必要があります。 – Callum
- 1. の最適化非末尾再帰関数
- 2. 末尾呼び出しの最適化はEcmascript6は末尾呼び出しの最適化(TCO)を導入し
- 3. Scalaの末尾再帰によってjava.lang.StackOverflowError
- 4. 特定のシナリオでスカラックが末尾再帰を最適化できないのはなぜですか?
- 5. F#の末尾再帰
- 6. 末尾再帰POWアーラン
- 7. 末尾再帰レーベンシュタイン距離
- 8. 再帰関数の結果を乗算したときにg ++がまだ末尾再帰を最適化するのはなぜですか?
- 9. switch文の末尾が再帰的か?
- 10. F#の末尾再帰呼び出し
- 11. 末尾再帰と、私はこのサイトを見ていた
- 12. 再帰関数を末尾再帰に変換する
- 13. Haskell再帰関数はリストの末尾に追加します
- 14. Kotlin:相互再帰関数のための末尾再帰
- 15. F#計算式と末尾再帰の再帰的バインド
- 16. 再帰関数を最適化する
- 17. Scalaでこの再帰的メソッドの尾を再帰的にする方法は?
- 18. 再帰関数の最適化
- 19. 再帰SQLクエリの最適化
- 20. 再帰的プログラムの最適化
- 21. この例では、再帰を末尾再帰に変換する方法はありますか?
- 22. 末尾再帰を正しく使うには?
- 23. 2つのリストを末尾再帰的にマージするには?
- 24. 再発は完全に末尾再帰関数
- 25. 私の末尾再帰を修正する方法は分かりません(元々は定期的再帰)
- 26. TCOを実装する言語で末尾再帰の再帰深度に制限はありますか?
- 27. ES6クラスの再帰メソッドはTCO(テールコール最適化)を利用しますか?
- 28. は、どのように関数がF#で末尾再帰は
- 29. curried形式の再帰関数は末尾再帰型にできますか?考える
- 30. 方法から削除末尾再帰(Java)の
"現在の状況はprotoです80%。わかりません。私はArnold Schwaighoferが何年も前にJohn Roseの指導の下でこれを完全に実装したと思ったのですか? –
@ JanHarropは、一般的なテールコールではなく、テール再帰に関するものかもしれません。 – Cubic
@Cubic:いいえ、一般的なテールコールでした。アーノルドもLLVMでそれらを実装しました。 –