scala - 在 Scala 中递归计算平方根

标签 scala recursion square-root

以下代码有效,但我不太明白参数如何映射到参数列表。请注意,我是 Scala 新手。

import Math.abs

val tolerance = 0.0001
def isCloseEnough(x: Double, y: Double) =
  abs((x - y) / x) / x < tolerance

def fixedPoint(f: Double => Double)(firstGuess: Double) = {
  def iterate(guess: Double): Double = {
    val next = f(guess)
    if (isCloseEnough(guess, next)) next
    else iterate(next)
  }
  iterate(firstGuess)
}

def averageDamp(f: Double => Double)(x: Double) = (x + f(x)) / 2

def sqrt(x: Double) =
  fixedPoint(averageDamp(y => x / y))(1.0)

sqrt(2.0)

上面的sqrt函数的主体是fixedPoint(averageDamp(y => x/y))(1.0)

哪里

(y => x/y) 映射到 averageDamp 函数的 (f: Double => Double)

(1.0) 映射到 fixedPoint 函数的 (firstGuess: Double),但是

看起来没有任何内容映射到 averageDamp 函数的 (x: Double)

提前谢谢您。

最佳答案

这称为currying 。真正发生的是,averageDamp(y => x/y) 被解释为一个函数:Double => Double,因为一旦将第一个参数列表设置为特定的一组值,您将获得一个采用第二个参数列表的函数。

例如,考虑以下代码:

def multiply(x: Double)(y: Double) = x * y

val multiplyByFive: Double => Double = multiply(5)
println(multiplyByFive(2)) // 10
println(multiplyByFive(6)) // 30

如您所见,仅对两个参数列表中的一个应用 multiply 会创建第二个参数列表的新函数(此处 (y: Double) ),第一个参数列表具有一组固定值(此处为 (5))。

另一种等效的编写方法如下:

val multiplyByFive: Double => Double = multiply(5)(_)

这里我们显式应用带有两个参数列表的函数,但对第二个参数列表使用通配符,这是告诉编译器创建一个用函数参数替换下划线的函数的一种方式。

关于scala - 在 Scala 中递归计算平方根,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42463794/

相关文章:

jquery - 使用 jquery 函数在 lift 框架片段中显示 div

Scala Stream 按需调用(懒惰)与按名称调用

scala - 使用 Dockerfile 安装 Docker

Python:当多个子节点引用回父节点时,如何在递归循环中找到多个路径?

c# - 如何显示二次公式的解

embedded - 为 ARM Thumb2 寻找高效的整数平方根算法

scala - 使用 Scala 进行 Akka actors 单元测试

java - 递归构建 <ul> 列表

python - 如何在递归函数中存储值?

python - Julia 中的任意精度算术