【问题标题】:Scala: folding on Stream of fibonacci numbersScala:折叠斐波那契数字流
【发布时间】:2016-08-02 10:42:51
【问题描述】:

我正在尝试在 Scala 中创建一个函数,该函数接受一个 Integer 参数并返回斐波那契数的加法到给定的 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

【问题讨论】:

  • 显然你得到了一个永不终止的递归。
  • 我遇到的最简洁的斐波那契流:def fib: Stream[Int] = 0 #:: fib.scan(1)(_+_)

标签: scala fibonacci fold


【解决方案1】:

stackoverflow是由.filter(_&lt;=n)引起的,filter需要迭代0 #:: 1 #:: (f.zip(f.tail)).map{t=&gt;t._1 + t._2}生成的所有fibonaci数列表。

也许你想要:

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

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

【讨论】:

  • 一个问题...为什么 fibonacci(5)、fibonacci(6)、fibonacci(7)、fibonacci(8) 都返回 12?
  • 5, 6, 7 他们都有相同的斐波那契数:0, 1, 1, 2, 3, 5,但对于8 应该是:0, 1, 1, 2, 3, 5, 8,你能再检查一下你的fibonacci(8) 吗?
  • fibonacci(8) 仍然返回 12
  • 好吧,我有 takeWhile(_
猜你喜欢
  • 1970-01-01
  • 2020-01-18
  • 1970-01-01
  • 2015-06-05
  • 2014-05-23
  • 2014-05-03
  • 1970-01-01
相关资源
最近更新 更多