这是我previous question的后续行动。我想自己实施s.scanLeft(0)(_ + _)
(就像练习一样)
也就是说,我想编写函数partial_sums
,它接收流s = s1, s2, s3, ...
并生成一个新流s1, s1 + s2, s1 + s2 + s3, ...
我按如下方式实现:
def add_streams(s1:Stream[Int], s2:Stream[Int]) = (s1 zip s2) map {case (x, y) => x + y} def partial_sums(s:Stream[Int]):Stream[Int] = Stream.cons(s.head, add_streams(partial_sums(s), s.tail))
此代码可以正常工作。然而,看起来需要O(n)来获得partial_sums
的第n个元素。 (即s [1] + s [2] + s [3] ... + s [n])。我想编码partial_sums[n] = partial_sums[n-1] + s[n]
,它采用O(1)来计算第n个元素。
这是对的吗?你会如何修复代码?
答案 0 :(得分:8)
基本思路是保持总计,而不是批量添加流
def partialSums(s:Stream[Int]) = if(s.isEmpty) new Stream[Int]() else partialSums(s, 0)
def partialSums(s:Stream[Int], runningTotal:Int)= Stream.cons(s.head+runningTotal, partialSums(s.tail, s.head+runningTotal)