在下面的代码片段中,我使用reduceLeft和foreach循环来查找数字与所有列表成员的差异总和。我期待这两个的结果是相同的(1050)但是reduceLeft在最终答案中增加了额外的50(val x)。这背后的原因是什么?
val list = List(200,400,600)
val x = 50
println(list.reduceLeft((total, cur) => total + Math.abs(x - cur)))
var total = 0l
list.foreach(p => {
total = total + Math.abs(x - p)
})
println(total)
答案 0 :(得分:3)
这是因为您没有从列表中的第一个值中减去50。您的reduceLeft函数正在执行此操作:
Iteration 1: 200 + Math.abs(50 - 400)
Iteration 2: 550 + Math.abs(50 - 600)
Result: 1100
尝试使用foldLeft
list.foldLeft(0)((total, cur) => total + Math.abs(50 - cur))
答案 1 :(得分:2)
我认为foldLeft
可以更清晰,但您仍然可以使用reduceLeft
作为初始值,使用0
作为初始值:
(0 :: list).reduceLeft((total, cur) => total + Math.abs(x - cur))