为什么不能scalac优化在某些情况下尾递归?
-
18-09-2019 - |
题
为什么没有scalac(该斯卡拉编译器)优化尾递归?
代码和编译器调用演示此:
> 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)); } }
解决方案
这可以重写不能是尾递归方法。尝试这样:
class Foo {
private def ifak(n: Int, acc: Int): Int = {
if (n == 1) acc
else ifak(n-1, n*acc)
}
}
其他提示
尝试这种情况:
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
可是递归的,但它可能不为好。标记类或方法最终,并应大概由尾递归。
内在功能也享有TCO。
不隶属于 StackOverflow