加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

如何在Scala中修复我的Fibonacci流

发布时间:2020-12-16 09:27:01 所属栏目:安全 来源:网络整理
导读:我定义了一个返回Fibonacci流的函数,如下所示: def fib:Stream[Int] = { Stream.cons(1,Stream.cons(2,(fib zip fib.tail) map {case (x,y) = println("%s + %s".format(x,y)); x + y}))} 功能正常但看起来效率低(参见下面的输出) scala fib take 5 foreach
我定义了一个返回Fibonacci流的函数,如下所示:

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

功能正常但看起来效率低(参见下面的输出)

scala> fib take 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的另一个好处;在Java中,方法可能是递归的,但类型和值可能不是.在scala中,值和类型都可以递归.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读