我正在尝试返回第一个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;
}
答案 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)
}