Scala 如何返回前N个斐波那契数的流?
我试图返回一个以N为参数的前N个斐波那契流。如果我把6传递给我的函数,我会得到“0,1,1,2,3,5”,如果我传递了7,我会得到“0,1,1,2,3,5,8”,依此类推。关于如何实现这一点有什么想法吗 以下是我到目前为止的情况:Scala 如何返回前N个斐波那契数的流?,scala,Scala,我试图返回一个以N为参数的前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) + fibonac
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;
}
def fibonacci(n:Int):流[Int]={
如果(n==0)返回0;
如果(n创建斐波那契流
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
,否则编译器会感到困惑并给出:
“错误:正向引用超出了值fib的定义”
我更喜欢这个版本,尽管它速度较慢,以防您真的需要所有数字;-)
我相信@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)
}
这里还有一个:
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)
将这两行代码放到你的斐波那契函数中。这就是你所需要的全部代码。这两行代码和末端支架}
就完成了。你确定吗?它似乎不起作用。你测试过了吗?那肯定有效,而且很神奇。我曾经认为ScalaDoc中的流实现很短。感谢@marios的编辑和澄清。向@abpre道歉。我确实测试了代码,但我使用了def fib
而不是val fib
,这也解决了“正向参考”问题。您能将评分最高的答案标记为正确吗?谢谢你,我刚刚做了。谢谢你,马里奥!是的,这实际上就是您应该如何使用流。我之前也在几乎相同的问题上发布了这个解决方案。我只是想指出,有一种直接计算斐波那契数的方法,我厌倦了对同一类问题给出同样的答案;-)递归流定义非常酷:)。谢谢分享你的答案!
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)