如何通过Scala中的函数式编程编写求和函数

问题描述

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

解决方法

仅使用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