Scala中运行总和的流

时间:2011-12-12 18:20:30

标签: scala stream

这是我上一个问题的后续行动 给定函数add_stream(s1:Stream[Int], s2:Stream[Int]):Stream[Int] 我想编写running_sums(s:Stream[Int]):Stream[Int]代码,它会返回一个新流:s1, s1 + s2, s1 + s2 + s3, ...

我可以考虑以下实现,但如果s为空

则不起作用
def running_sums(s:Stream[Int]):Stream[Int] =
  Stream.cons(s.head, add_streams(s.tail, running_sums(s)))

我可以修改如下:

def running_sums(s:Stream[Int]):Stream[Int] =
  if (s.isEmpty) empty
    else Stream.cons(s.head, add_streams(s.tail, running_sums(s)))

然而它看起来并不优雅。

您将如何实施running_sums

2 个答案:

答案 0 :(得分:7)

有一个类似于此的库调用,名为scanLeft

s.scanLeft(0)(_+_).tail

答案 1 :(得分:5)

scanLeft怎么样?

scala> val sums = stream.scanLeft(List(0))((ns, n) => ns :+ (ns.last + n))
sums: scala.collection.immutable.Stream[List[Int]] = Stream(List(0), ?)

scala> sums take 5 foreach println
List(0)
List(0, 1)
List(0, 1, 3)
List(0, 1, 3, 6)
List(0, 1, 3, 6, 10)