我试图想出一个无穷无尽的Fibonacci数字序列函数,它传递两个参数。参数将设置序列中的前2个元素。
def fib(i: Int, j: Int): Stream[Int] = {
case 0 | 1 => current
case _ => Fib( current-1 ) + Fib( current -2 )
}
答案 0 :(得分:1)
这很容易做到,但是,你必须在另一个方向重复。您没有根据前面的元素定义当前元素,但是您的函数接收当前参数并使用下一个值的参数调用自身:
def fib(i: Int, j: Int): Stream[Int] = i #:: fib(j, i + j)
println(fib(0,1).take(10))
与典型的递归定义相比,这不是quaratic而是线性的,所以它非常有效。 (Streams当然比简单的while循环更复杂。)
答案 1 :(得分:0)
为了提高效率,通常使用Stream
来完成此类操作,以避免反复重新计算相同的值。创建Stream
斐波纳契数的直接方法是
val fibs: Stream[BigInt] = 0 #:: 1 #:: ( fibs zip fibs.tail map ( n => n._1 + n._2 ) )
但是你可以通过避免使用zip来制作这种Stream的更高效版本,如下所示:
val fibs: Stream[BigInt] = {
def loop( h:BigInt, n:BigInt ): Stream[BigInt] = h #:: loop(n, h+n)
loop(0,1)
}
请注意,这些使用val
; you generally DO NOT want to use def to define a stream!