问题描述
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