Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何返回前N个斐波那契数的流?_Scala - Fatal编程技术网

Scala 如何返回前N个斐波那契数的流?

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

我试图返回一个以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) + 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)