这是我上一个问题的后续问题。
给定函数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_sum (s:Stream[Int]):Stream[Int] =Stream.cons (s。头,add_streams (s。尾巴,running_sums (s))) 之前我可以修复它如下:
def running_sum (s:Stream[Int]):Stream[Int] =if (s.isEmpty)为空其他Stream.cons (s。头,add_streams (s。尾巴,running_sums (s))) 之前然而,它看起来并不优雅。
你将如何实现
running_sums
?
有一个类似的库调用,叫做scanLeft
s.scanLeft(0)(_+_).tail
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)