私はM. Odersky著によるスカラ座でのプログラミングを読んでいると、彼はなぜ機能テールは再帰的ではありませんか?
Functions like approximate, which call themselves as their last action, are called tail recursive.
だから、私はこの試みたことを述べている:
object Main extends App {
implicit val mc = new MyClass(8)
val ti = new TestImplct
ti.test
}
class TestImplct {
def test(implicit mc : MyClass): Unit = {
println(mc.i)
mc.i -= 1
if(mc.i < 0){
throw new IllegalArgumentException
}
test
}
}
class MyClass(var i : Int)
をしかし、それは次のスタックトレースを生成し
Exception in thread "main" java.lang.IllegalArgumentException
at TestImplct.test(Main.scala:13)
at TestImplct.test(Main.scala:15)
at TestImplct.test(Main.scala:15)
at TestImplct.test(Main.scala:15)
at TestImplct.test(Main.scala:15)
at TestImplct.test(Main.scala:15)
at TestImplct.test(Main.scala:15)
at TestImplct.test(Main.scala:15)
at TestImplct.test(Main.scala:15)
つまり、ge再帰呼び出しごとに新しいスタックフレームをネーティングします。しかし、最後のアクションは、それ自身を呼び出すことです。何が間違っていて、それを末尾再帰的にするのですか?
なぜコンパイラはテールコールの最適化を行いませんか?
MyClassの暗黙的なインスタンスが範囲内にありますか? – Samar
@Samarはい、あります。デモを見て – stella
私はあなたがクラスを定義したのを見ます。しかし、私はあなたがそれをインスタンス化した場所を見ていません。 – Samar