gpt4 book ai didi

Scala和尾递归

转载 作者:行者123 更新时间:2023-12-05 00:08:16 26 4
gpt4 key购买 nike

Stack Overflow 上有各种答案,解释了 Scala 中可能出现尾递归的条件。 .我了解限制以及如何以及在何处可以利用尾递归。我不明白的部分是为什么存在对私有(private)或 final方法的限制。

我还没有研究 Scala 编译器实际上是如何在字节码级别将递归函数转换为非递归函数的,但我们假设它执行以下操作。我有课Foo带有递归函数mod :

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/Barmod调用它,为什么解析 mod有问题应该使用的功能。为什么这与基函数非递归的情况有什么不同?

我认为出现这种情况的几个可能原因是:
  • 无论出于何种原因,Scala 编译器的实现都不能处理这个问题(如果是这样的话,那就足够了。如果是这样,有计划改变这个吗?)
  • Foo mod函数被修改为 mod-non-recursive在编译期间所以 Foo实际上没有 mod方法来覆盖。
  • 最佳答案

    我刚刚回答了这个问题,但让我们以你自己的例子为例。假设您定义了 Foo 类,并将其作为 JAR 文件提供。

    然后我得到那个 Jar 文件,并以这种方式扩展你的 Foo:

    class Bar extends Foo {
    def mod(value:Int, denom: Int): Int = {
    Logger.log("Received mod with "+value+" % "+denom)
    super.mod(value, denom)
    }

    现在,当 Foo 的 mod调用自己,因为我的对象是 Bar ,而不是 Foo ,你应该(并且确实)去酒吧的 mod ,而不是 Foo 的。

    因为这是真的,所以你不能按照你展示的方式优化它。

    子类化的约定是,当父类(super class)调用自己的方法时,如果该方法已被覆盖,它将是要调用的子类的方法。

    将方法声明为私有(private)的,使其成为最终的,或者类——或者甚至创建一个递归函数而不是一个方法,所有这些都可以确保您不必去子类实现。

    关于Scala和尾递归,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1702831/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com