Scala:折叠斐波那契数流

Scala: folding on Stream of fibonacci numbers

我正在尝试在 Scala 中创建一个函数,该函数接受一个 Integer 参数和 returns 将斐波那契数加到给定的 fib。数字。我正在使用 Stream 获取 fib。数字,然后向右折叠以添加它们。为什么会产生堆栈溢出,我该如何解决?

def fibonacci(n: Int): Long = {
lazy val f: Stream[Int] = 0 #:: 1 #:: (f.zip(f.tail)).map{t=>t._1 + t._2}.filter(_<=n)
f.foldRight(0)(_+_).toLong
}

例如,输入 5,我会期望 0 + 1 + 1 + 2 + 3 + 5 = 12

Whosebug是由.filter(_<=n)引起的,filter需要遍历0 #:: 1 #:: (f.zip(f.tail)).map{t=>t._1 + t._2}生成的所有斐波那契数列表。

也许你想要:

0 #:: 1 #:: (f.zip(f.tail)).map{t=>t._1 + t._2}.takeWhile(_ <= n)

takeWhile 将 return 直接匹配谓词数字并中止以迭代其他数字。