这是我上一个问题的后续行动.
给定函数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?
怎么样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)
Run Code Online (Sandbox Code Playgroud)