gpt4 book ai didi

Stream类型的Scala递归实现

转载 作者:行者123 更新时间:2023-12-02 02:27:17 25 4
gpt4 key购买 nike

我已经开始在 Coursera 上学习 Scala,并对 squareRootGuess 实现有一些疑问,如下

我正在尝试实现标准来过滤 sqrtGuess 定义中的准确猜测,如下所示,但它给了我堆栈溢出错误。

def sqrtGuess(x: Double): Stream[Double] = { 
def nextGuess(guess: Double): Double = (guess + x / guess)/2

def isSufficient(guess: Double): Boolean = math.abs(x - guess*guess)/x < 0.001

def guesses: Stream[Double] =
1 #:: guesses.map(nextGuess).filter(isSufficient)

guesses
}

但是,如果我们在 sqrtGuess 之外定义 isSufficient 并将其应用于 sqrtGuess 流,则效果很好。

def sqrtGuess(x: Double): Stream[Double] = { 
def nextGuess(guess: Double): Double = (guess + x / guess)/2
def guesses: Stream[Double] =
1 #:: guesses.map(nextGuess)
guesses
}

def isSufficient(guess: Double, x: Double): Boolean = math.abs(x - guess*guess)/x < 0.001

sqrtGuess(4.2).filter(isSufficient(_, 4.2)).take(10).toList

我想知道 sqrtGuess 的第一次实现中发生了什么?我试图用替代模型来证明这一点,但似乎没有任何问题。

最佳答案

我假设您从 Stream 开始使用 Scala 2.12在 Scala 2.13 中已弃用,并显示以下弃用消息:

Use LazyList (which is fully lazy) instead of Stream (which has a lazy tail only)

我没有真正的证据证明我要说的话,但我可以假设这是正在发生的事情:

在非工作示例中,您尝试根据 x = 4.2guess = 1.0 生成一个列表。计算的下一个元素将被过滤器删除。所以下一个不会添加到流中。因此,猜测总是无法为流创建新元素,并且我们永远无法在流中获得 10 个元素。堆栈溢出是由于无限递归造成的。

为了过滤,您需要首先创建流,并对其进行过滤:

def sqrtGuess1(x: Double): Stream[Double] = {
def nextGuess(guess: Double): Double = (guess + x / guess)/2

def isSufficient(guess: Double): Boolean = math.abs(x - guess*guess)/x < 0.001

def guesses: Stream[Double] =
1 #:: guesses.map(nextGuess)

guesses.filter(isSufficient)
}

关于Stream类型的Scala递归实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65463023/

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