为什么没有scalac(该斯卡拉编译器)优化尾递归?

代码和编译器调用演示此:

> 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));
  }
}
有帮助吗?

解决方案

这可以重写不能是尾递归方法。尝试这样:

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

其他提示

尝试这种情况:

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)

注意,ifak 是递归的,但它可能不为好。标记类或方法最终,并应大概由尾递归。

内在功能也享有TCO。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top