【发布时间】:2016-09-11 09:38:32
【问题描述】:
当我这样定义fib 时(1):
def fib(n: Int) = {
lazy val fibs: Stream[BigInt] = 0 #:: 1 #:: fibs.zip(fibs.tail).map{n => n._1 + n._2}
fibs.drop(n).head
}
我收到一个错误:
scala> fib(1000000)
java.lang.OutOfMemoryError: Java heap space
另一方面,这很好用 (2):
def fib = {
lazy val fibs: Stream[BigInt] = 0 #:: 1 #:: fibs.zip(fibs.tail).map{n => n._1 + n._2}
fibs
}
scala> fib.drop(1000000).head
res17: BigInt = 195328212...
此外,如果我通过以下方式更改流定义,我可以在函数内调用drop(n).head,并且也不会出现任何错误(3):
def fib(n: Int) = {
lazy val fibs: (BigInt, BigInt) => Stream[BigInt] = (a, b) => a #:: fibs(b, a+b)
fibs(0, 1).drop(n).head
}
scala> fib(1000000)
res18: BigInt = 195328212...
您能否解释 (1)、(2) 和 (3) 之间的相关区别?为什么(2)有效,而(1)无效?为什么我们不需要将drop(n).head 移出(3)中的函数?
【问题讨论】:
标签: scala functional-programming stream fibonacci