为什么scalac在某些情况下不能优化尾递归?

Itt*_*ayD 8 performance scala tail-recursion scalac

为什么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));
  }
}

Wal*_*ang 12

可以重写的方法不能是尾递归.试试这个:

class Foo {
  private def ifak(n: Int, acc: Int): Int = {  
    if (n == 1) acc  
    else ifak(n-1, n*acc)  
  }
}
Run Code Online (Sandbox Code Playgroud)

  • @OscarRyz:见http://stackoverflow.com/questions/4785502/why-wont-the-scala-compiler-apply-tail-call-optimization-unless-a-method-is-fina (2认同)