如何创建序列?

时间:2016-02-06 01:14:51

标签: scala

我试图想出一个无穷无尽的Fibonacci数字序列函数,它传递两个参数。参数将设置序列中的前2个元素。

def fib(i: Int, j: Int): Stream[Int] = {
 case 0 | 1 => current
 case _ => Fib( current-1 ) + Fib( current -2 )

}

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