8

为什么scalac(Scala编译器)不优化尾递归?

演示这一点的代码和编译器调用:

> 猫 foo.scala
类Foo {
 def ifak(n: Int, acc: Int):Int = {  
   如果 (n == 1) 加起来  
   否则 ifak(n-1, n*acc)  
 }
}

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

公共课 Foo
  实现 ScalaObject
{
  公共 int ifak(int n, int acc)
  {
    返回((n == 1)?acc:
      ifak(n - 1, n * acc));
  }
}
4

3 回答 3

12

可以被覆盖的方法不能是尾递归的。试试这个:

class Foo {
  private def ifak(n: Int, acc: Int): Int = {  
    if (n == 1) acc  
    else ifak(n-1, n*acc)  
  }
}
于 2009-11-09T06:39:51.900 回答
1

试试这个:

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 可能是递归的,但也可能不是。将类或方法标记为final,它可能会进行尾递归。

于 2009-11-09T11:17:06.437 回答
0

内部函数也符合 TCO 条件。

于 2009-11-09T14:42:28.187 回答