我有这样的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/

10-12 01:10