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使用率很低?)
答案 0 :(得分:1)
我相信你的问题会缩小为“count
尾递归”。它是。因此,不需要保留对中间流值(x
)或计算(currentNum + 1
)的引用。 Scala具有@tailrec
注释,允许编译器验证您的递归是否处于尾部位置,从而能够执行尾调用优化。