scala - 如何在Scala中修复我的斐波那契流

标签 scala stream fibonacci

我定义了一个返回斐波那契流的函数,如下所示:

def fib:Stream [Int] = {
Stream.cons(1,
Stream.cons(2,
(fib zip fib.tail)映射{case(x,y)=> println(“%s +%s” .format(x,y)); x + y}))
}

该功能可以正常运行,但效率低下(请参见下面的输出)

scala> fib占用5 foreach println
1个
2个
1 + 2
3
1 + 2
2 + 3
5
1 + 2
1 + 2
2 + 3
3 + 5
8

因此,函数似乎从一开始就计算第n个斐波那契数。这是正确的吗?您将如何解决?

最佳答案

那是因为您使用了def。尝试使用val:

lazy val fib: Stream[Int] 
  = 1 #:: 2 #:: (fib zip fib.tail map { case (x, y) => x + y })

基本上,def是一种方法;在您的示例中,每次调用该方法时,每次方法调用构造一个新流时,都将调用该方法。 defval之间的区别为been covered on SO before,因此在此不再赘述。如果您来自Java背景,这应该很清楚。

这是关于scala的另一件事。在Java中,方法可能是递归的,但类型和值可能不是。在scala中,值和类型都可以是递归的。

关于scala - 如何在Scala中修复我的斐波那契流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8659127/

相关文章:

cordova - Phonegap 麦克风流

c++ - ostream 中的负精度值

database - 开始使用 Lift,使用数据库构建动态站点

scala - 从 Spark 中的 cassandra 表中删除

scala - 快速 Scala 编译器 : Unable to establish connection to compilation daemon

haskell - 无穷无尽的有效行动

haskell - 这个斐波那契函数是如何内存的?

用给定的最小值构造斐波那契树的算法

python - 在 python 中使用字典进行动态绑定(bind)?

Scala:包含在可变和不可变集合中