将元素流加总直到期望值

时间:2013-12-23 03:49:04

标签: scala lazy-evaluation

count需要Stream[Int]desiredNum个参数。它添加了流的头部(我认为,懒惰的方式)直到>= desiredNum的运行总和。

示例:count(Stream.continually(1), 2)应该从1 + 1 = 2获得2的输出。

这是我的代码:

  def count(as: Stream[Int], desiredNum: Int): Option[Int] = {
      def go(bs: Stream[Int], currentNum: Int, count: Int): Option[Int] = 
       bs match {
        case x #:: xs if(currentNum >= desiredNum) => Some(count)
        case x #:: xs => go(xs, currentNum + x, count + 1)
        case Stream() => None           
      }
      go(as, 0, 0)
   }

试验:

scala> count(Stream(1), 1)
res0: Option[Int] = Some(1)

scala> count(Stream.continually(1), 100)
res0: Option[Int] = Some(100)

编辑请注意,在我看到第一个case语句中没有检查正确的值后,我改变了我的问题。最初我使用x(Stream的头部)而不是currentNum。这导致了一个无限循环。

但是,desiredNum对CPU和RAM有特殊限制吗?这个函数正确使用Stream吗? (也许count中的RAM使用率很低?)

1 个答案:

答案 0 :(得分:1)

我相信你的问题会缩小为“count尾递归”。它是。因此,不需要保留对中间流值(x)或计算(currentNum + 1)的引用。 Scala具有@tailrec注释,允许编译器验证您的递归是否处于尾部位置,从而能够执行尾调用优化。