如何返回前N个Fibonacci数的流?

时间:2016-02-06 02:49:17

标签: scala

我正在尝试返回第一个N Fibonacci的流,其中N作为参数给出。所以,如果我将6传递给我的函数,我应该得到“0,1,1,2,3,5”,或者如果我通过7,我应该得到“0,1,1,2,3,5,8”和等等。关于如何实现这一点的任何想法?

这是我到目前为止所做的:

 def fibonacci(n: Int): Stream[Int] = {
   if (n == 0) return 0;
    if (n<= 2) return 1;

    fibTerm = fibonacci(n - 1) + fibonacci(n - 2);
    return fibTerm;
 }

4 个答案:

答案 0 :(得分:3)

创建斐波纳契流。

val fib: Stream[Int] = 0 #:: fib.scan(1)(_+_)

从中获取n个元素。

fib.take(n)

以下是在函数中添加它的方法:

def fibonacci(n: Int): Stream[Int] = {
   lazy val fib: Stream[Int] = 0 #:: fib.scan(1)(_+_)
   fib.take(n)
}

请注意,需要lazy,否则编译器会感到困惑并给出: “&lt;&gt;错误:前向引用扩展到值fib的定义”

答案 1 :(得分:2)

我相信@dth和@jwvh的答案很棒。为了完整起见,这是另一种选择:

def fibonacci(n: Int): Stream[Int] = {
   def f(a: Int, b: Int): Stream[Int] = a #:: f(b, a + b); 
   f(0,1).take(n)
}

答案 2 :(得分:1)

这是另一个:

scala> Stream.iterate((0, 1)){case (a, b) => (b, a + b)}.map(_._1)
res0: scala.collection.immutable.Stream[Int] = Stream(0, ?)

scala> res0.take(10).force
res1: scala.collection.immutable.Stream[Int] = Stream(0, 1, 1, 2, 3, 5, 8, 13, 21, 34)

答案 3 :(得分:0)

我更喜欢这个版本,即使它真的需要所有数字它会慢一些; - )

def fibonacci(n: Int): Stream[Int] = {
   def fib(n:Int) =
      Math.floor(Math.pow(0.5*(1.0+Math.pow(5,0.5)),n)/Math.pow(5,0.5)+0.5).toInt
   Stream.range(0,n).map(fib)
}