Возможно ли вычислить все суммы префиксов для массива чисел в стиле чисто функционального программирования в O (п) время в Котлине?
Под чисто функциональным программированием я подразумеваю использование функций расширения функционального программирования только для коллекций, таких как map
, reduce
, fold
, sum
и т. Д. В _ Collections, kt, в то время как традиционные методы императивного программирования, включающие изменение состояния и изменяемые данные, такие как обычные циклы, изменяемые переменные, также известные как var
s, а изменяемые массивы не допускаются. (Я думаю, это соответствует определению в Википедии)
Чтобы быть более конкретным, вот один пример того, чего я хочу достичь, написанный в императивном программировании, которое выполняется за время O (n), а другой - в функциональном программировании, которое выполняется за время O (n ^ 2).
fun prefixSumsImperative(numbers: IntArray): IntArray {
val prefixSums = IntArray(numbers.size)
var prefixSum = 0
for ((i, number) in numbers.withIndex()) {
prefixSum += number
prefixSums[i] = prefixSum
}
return prefixSums
}
fun prefixSumsFunctionalONSquared(numbers: IntArray): IntArray =
(0 until numbers.size).map { numbers.take(it).sum() }.toIntArray()
scan
, но, похоже, недоступен в Kotlin. Однако вы можете подражать этому, построив связанный список вfold
операции, а затем перевернув его (или выполнивfoldRight
). - person Bergi   schedule 16.10.2019