Pourquoi ne peut pas optimiser scalac récursion de queue dans certains scénarios?
-
18-09-2019 - |
Question
Pourquoi pas scalac ( compilateur Scala) optimiser la récursion arrière ?
invocations de code et compilateur qui illustre cela:
> 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)); } }
La solution
Les méthodes qui peuvent être surchargées ne peuvent pas être récursive queue. Essayez ceci:
class Foo {
private def ifak(n: Int, acc: Int): Int = {
if (n == 1) acc
else ifak(n-1, n*acc)
}
}
Autres conseils
Essayez ceci:
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)
Notez que ifak
peut récursive, mais il ne peut pas aussi bien. Marquez la classe ou la finale de la méthode, et il doit probablement fait récursive.
Fonctions intérieures sont également admissibles au coût total de possession.
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow