我如何 return IntArray 减少或折叠?

How I can return IntArray with reduce or fold?

我的任务有以下数据:

Input: nums = [1,2,3,4]
Output: [1,3,6,10]
Explanation: Running sum is obtained as follows: [1, 1+2, 1+2+3, 1+2+3+4].

如你所见,我需要return IntArray,我首先使用的是runningReduce(),但是这个功能在Kotlin 1.4.30的版本中使用。

fun runningSum(nums: IntArray): IntArray {
    return nums.runningReduce { sum, element -> sum + element }.toIntArray()
}

是的,这个解决方案有效,但我如何使用 reduce()fold() 解决同样的问题?

尝试以下操作:

nums.fold(listOf(0)) { acc, i -> acc + (acc.last() + i) }.drop(1).toIntArray()

虽然解决方案不是最优的:它在每次迭代中复制列表。但是看起来很别致。

为了避免复制,可以这样写:

nums.fold(mutableListOf(0)) { acc, i -> acc += (acc.last() + i); acc }.drop(1).toIntArray()

我觉得我更喜欢第一个版本,第二个从功能的角度来看并不纯粹。

Mafor 是对的,fold() 在生成集合时不是一个好的选择,因为它每次都会复制集合,因此您需要使用可变集合来解决问题,这违背了函数式风格的要点。

如果您真的想使用可变的数组,最好采用老式的程序方式:

val array = intArrayOf(1, 2, 3, 4)
for (i in array.indices.drop(1)) {
    array[i] += array[i - 1]
}
println(array.joinToString(", "))

这里是 Mafor 答案的一个稍微修改过的版本,它给你一个 IntArray 并避免使用多个语句——尽管它仍然使用可变列表:

val input = intArrayOf(1, 2, 3, 4)
val output = input.fold(mutableListOf(0)) { acc, cur ->
    acc.apply { add(last() + cur) }
}.drop(1).toIntArray()

println(output.joinToString(", "))

这两个打印 1, 3, 6, 10.