作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我定义了一个返回斐波那契流的函数,如下所示:
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
是一种方法;在您的示例中,每次调用该方法时,每次方法调用构造一个新流时,都将调用该方法。
def
和
val
之间的区别为
been covered on SO before,因此在此不再赘述。如果您来自Java背景,这应该很清楚。
关于scala - 如何在Scala中修复我的斐波那契流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8659127/
我是一名优秀的程序员,十分优秀!