【问题标题】:How to write sum function by functional programming in Scala如何在 Scala 中通过函数式编程编写 sum 函数
【发布时间】:2020-12-31 03:32:12
【问题描述】:
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

【问题讨论】:

  • (1 to n).fold(0)((s,x) =&gt; s + x * f(x))
  • (0 to n).reduce((s,x) =&gt; s + x * f(x))
  • 我刚刚想通了,如果我想用范围(1 到 n)来做,实际上我需要(0 到 n)。这将是 (0 to n).reduce((x, y) => x + y * f(y))
  • 是的,那是真的,谢谢

标签: scala functional-programming reduce fold


【解决方案1】:

通常只使用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

【讨论】:

  • .fold(0)(_+_).sum 相同,但无论哪种方式,它都与sum1() 结果不同。
  • 你是对的,错过了乘法。感谢您指出,我编辑了答案顺便说一句
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-06
  • 2020-11-22
  • 1970-01-01
  • 1970-01-01
  • 2016-05-12
  • 2011-05-07
  • 1970-01-01
相关资源
最近更新 更多