【发布时间】:2009-11-09 18:27:57
【问题描述】:
Stack Overflow 上有各种答案,解释了在Scala 中可以进行尾递归的条件。我了解限制以及如何以及在何处可以利用尾递归。我不明白的部分是为什么存在对私有或最终方法的限制。
我还没有研究过 Scala 编译器实际上是如何在字节码级别将递归函数转换为非递归函数的,但我们假设它执行以下操作。我有一个带有递归函数mod 的类Foo:
class Foo {
def mod(value: Int, denom: Int): Int = {
if(denom <= 0 || value <= 0) 0
else if(0 <= value && value < denom) value
else mod(value - denom, denom)
}
}
这是一个基本的模函数,我想 Scala 编译器会将其转换为某种伪 Java-Scala,例如:
class Foo {
def mod(value: Int, denom: Int): Int = {
if(denom <= 0 || value <= 0) return 0
while(value > denom) value -= denom
return value
}
}
(我可以相信我把翻译搞砸了,但我认为细节并不重要..)
所以现在假设我继承Foo:
class Bar extends Foo {
def mod(value:Int, denom: Int): Int = 1
}
是什么阻止了它的工作?当JVM有一个Foo/Bar并且在上面调用mod时,为什么解析应该使用的mod函数会出现问题。为什么这与基函数非递归的情况有什么不同?
我认为出现这种情况的几个可能原因是:
无论出于何种原因,Scala 编译器的实现都无法处理这个问题(如果是这样的话,这很公平。如果是这样,是否有计划改变它?)
在
Foo中,mod函数在编译期间被转换为mod-non-recursive,因此Foo实际上没有要覆盖的mod方法。
【问题讨论】:
标签: scala tail-recursion