【问题标题】:How to fix my implementation of partial sums in Scala?如何修复我在 Scala 中实现部分和的问题?
【发布时间】:2011-12-28 13:59:00
【问题描述】:

这是我的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) 映射 {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 个元素。

正确吗?您将如何修复代码?

【问题讨论】:

    标签: scala stream


    【解决方案1】:

    基本的想法是保持一个运行总数,而不是批量添加流

    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)
    

    【讨论】:

    • 你的意思是s:Stream[Int] i/o s:String
    猜你喜欢
    • 2018-11-14
    • 2015-12-05
    • 2011-02-06
    • 2021-01-06
    • 1970-01-01
    • 1970-01-01
    • 2014-10-13
    • 2018-04-13
    • 2012-06-07
    相关资源
    最近更新 更多