Frage

Warum nicht scalac (die Scala Compiler) optimieren Endrekursion ?

-Code und Compiler Anrufungen, dass dies zeigt:

> 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));
  }
}
War es hilfreich?

Lösung

Methoden, die nicht Schwanz rekursiv sein kann außer Kraft gesetzt werden kann. Versuchen Sie folgendes:

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

Andere Tipps

Versuchen Sie folgendes:

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)

Beachten Sie, dass ifak können rekursiv sein, aber es kann nicht so gut. Markieren Sie die Klasse oder das Verfahren endgültig, und es wird wahrscheinlich gemacht Schwanz-rekursiv.

Inner-Funktionen sind ebenfalls förderfähig für TCO.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top