Scala:在斐波那契数字流上折叠

时间:2016-04-12 02:51:01

标签: scala fibonacci fold

我试图在Scala中创建一个函数,它接受一个I​​nteger参数并返回给定fib的斐波那契数的加法。数。我正在使用Stream来获取虚拟。数字,然后向右折叠添加它们。为什么会产生堆栈溢出,我该如何解决?

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

1 个答案:

答案 0 :(得分:4)

stackoverflow.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 将直接返回匹配的谓词数字并中止以迭代其他数字。