8

scalac ( Scalaコンパイラ)が末尾再帰を最適化しないのはなぜですか?

これを示すコードとコンパイラの呼び出し:

> 猫 foo.scala
クラス Foo {
 def ifak(n: Int, acc: Int):Int = {  
   もし (n == 1) acc  
   そうでなければ ifak(n-1, n*acc)  
 }
}

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

公開クラス Foo
  ScalaObject を実装する
{
  public int ifak(int n, int acc)
  {
    return ((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 に答える