2009-11-09 7 views
8

scalac(Scalaコンパイラ)が末尾再帰を最適化しないのはなぜですか?これを示し特定のシナリオでスカラックが末尾再帰を最適化できないのはなぜですか?

コードおよびコンパイラの呼び出し:

 
> cat foo.scala 
class Foo { 
def ifak(n: Int, acc: Int):Int = { 
    if (n == 1) acc 
    else ifak(n-1, n*acc) 
} 
} 

> scalac foo.scala 
> jd-gui Foo.class 
import scala.ScalaObject; 

public class Foo 
    implements ScalaObject 
{ 
    public int ifak(int n, int acc) 
    { 
    return ((n == 1) ? acc : 
     ifak(n - 1, n * acc)); 
    } 
} 
+1

JVMレベルのテールコール最適化がJava 7に寄与していることに注意してください。http://wikis.sun.com/display/mlvm/TailCalls –

答えて

12

上書きすることができる方法は末尾再帰することはできません。これを試してみてください:ifak再帰的かもしれないが、それは同様ではないことを

class Foo { 
    def ifak(n: Int, acc: Int):Int = { 
    if (n == 1) acc 
    else ifak(n-1, n*acc) 
    } 
} 

class Bar extends Foo { 
    override def ifak(n: Int, acc: Int): Int = { 
    println("Bar!") 
    super.ifak(n, acc) 
    } 
} 

val foobar = new Bar 
foobar.ifak(5, 1) 

は予告:

class Foo { 
    private def ifak(n: Int, acc: Int): Int = { 
    if (n == 1) acc 
    else ifak(n-1, n*acc) 
    } 
} 
+0

+1根拠はなんですか? (私はそれを想像することができますが、私は知りたいと思います) – OscarRyz

+2

@OscarRyz:http://stackoverflow.com/questions/4785502/why-wont-the-scala-compiler-apply-tail-call-optimization-それ以外の場合は、 –

1

これを試してみてください。クラスまたはメソッドを最終的にマークすると、おそらくテール再帰的になります。

0

内部機能もTCOの対象です。

関連する問題