2017-02-03 5 views

ответ

10

Эта операция называется prefix sum, cumulative sum, or inclusive scan, более обобщенная функция более высокого порядка обычно называется scan. Scala предоставляет scan как часть своей библиотеки коллекций:

ints.scan(0)(_ + _).tail 
+0

Короткий и простой, как я надеялся, хотя вызов сканирования с начальным состоянием по умолчанию в качестве первого элемента списка будет еще лучше – MaciejF

+0

Like ints.scan (_ + _) – MaciejF

+0

К сожалению, я не думаю, что есть эквивалент [Haskell's 'scanl1'] (https://hackage.haskell.org/package/base-4.9.1.0/docs/Prelude.html#v:scanl1), как есть ['fold'] (http://scala-lang.org/api/current/scala/collection/Seq.html#fold [A1>: A] (z: A1) (op: (A1 , A1) => A1): A1)/['reduce'] (http://scala-lang.org/api/current/scala/collection/Seq.html#reduce [A1>: A] (op :(A1, A1) => A1): A1) –

0

Вы можете использовать foldLeft следующим образом:

scala> List(1,2,3,4,5).foldLeft(List.empty[Int]) { case (acc, next) => 
    | acc :+ next + acc.lastOption.getOrElse(0) 
    | } 
res6: List[Int] = List(1, 3, 6, 10, 15) 

В частичной функции (acc, next), acc является в настоящее время накоплено список, который начинается как List.empty[Int] и next является следующее значение в предоставленном списке, начиная с 1 ,

+0

OP сказал «* простой * -функционала :) –

+0

Простота относительна.: P – Eric

0
ints.foldLeft(List[Int]())((acc,elem)=>elem+acc.headOption.getOrElse(0)::acc) 
+0

Это приводит к обратному lis t, поэтому вам нужно будет вызвать '.reverse' в конце. – Eric

+0

Ой, я забыл, ты прав. С: + было бы лучше – Chobeat

+0

@ Чобать не было бы, потому что append был бы O (N), как и необходимый lastOption. Выполняя всю операцию O (N * 2) –

0

О, продолжай, другой способ кожи кошки:

ints.drop(1).foldLeft(List(ints.head))((acc,elem)=>elem+acc.head::acc).reverse 
0

Благодаря Ли ответ я изменил его

ints.tail.scan(ints.head)(_ + _) 

Немного дольше, но он рассматривает первый элемент как начальное состояние.

+1

, используйте 'ints.drop (1) ...', тогда он не будет генерировать исключение, если 'ints' пуст. - –

+0

Я думаю, что ответы @Lee намного проще читать –

+0

Это также подвержено исключениям, если коллекция пуста. – stefanobaghino