【问题标题】:Stream of running sums in ScalaScala中的运行总和流
【发布时间】:2011-12-12 18:20:30
【问题描述】:

这是我上一个问题的后续。
给定函数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) 为空
    else Stream.cons(s.head, add_streams(s.tail, running_sums(s)))

但它看起来并不优雅。

您将如何实现running_sums

【问题讨论】:

    标签: scala stream


    【解决方案1】:

    有一个类似这样的库调用,称为 scanLeft

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

    【讨论】:

      【解决方案2】:

      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)
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-02
        • 2017-05-25
        相关资源
        最近更新 更多