Warum kann nicht Endrekursion in bestimmten Szenarien scalac optimieren?
-
18-09-2019 - |
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)); } }
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