首页 > 解决方案 > 如何在 Scala 中通过函数式编程编写 sum 函数

问题描述

def f(x: Int): Int = x + 1

def sum1(n: Int): Int = {
   var sum: Int = 0
   for (i <- 1 to n) {
     sum += i * f(i)
  }
  sum
}

val sum2: Int => Int = (n: Int) => (1 to n).reduce((x, y) => x * f(x) + y * f(y))

sum2 函数是错误的,但我想知道如何使用 reduce 或 fold 编写 sum1

标签: scalafunctional-programmingreducefold

解决方案


仅使用通常更安全,fold因为边缘情况已经被烘焙到签名中,而reduce在空列表上会失败(这就是为什么你需要从 0 而不是 1 开始)

这是一个完美的解决方案。然而,由于 Scala 是一种表达性语言,有很多方法可以达到相同的结果。例如,您还可以将计算f(x)步骤与将所有事物相加的步骤分开,如下所示

(1 to n).map(x => x * f(x)).fold(0)(_ + _)
// or using sum like jwvh suggested
(1 to n).map(x => x * f(x)).sum

推荐阅读