我有这样的Scala代码
var i = 1
for(e <- array) {
acc += e * i
i += 1
}
我需要将数组中的第一个元素乘以1,将下一个乘以2,再乘以3,依此类推,将其全部添加到累加器中。我觉得在Scala中有更好的方法,甚至可以折叠吗?
最佳答案
val x = List(1,1,1,1,1,1)
(((0,1) /: x){case ((acc, mult), l) => (acc + (l * mult), mult + 1) })._1
换句话说,从0的累加器和1的乘数开始,将列表中的每个元素折叠,将累加器更改为
acc + (l * mult)
并将乘数递增1。我们也从末尾得到了最终的乘数,因此我们调用._1
即可获取累加器。编辑:正如@RexKerr在下面的答案(和评论)中指出的那样,如果性能是主要问题,那么最好使用显式递归方法。
关于arrays - foldLeft中的递增变量,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/15227488/