def immutable_iterative_fibonacci(position): if (position ==1): return [1] if (position == 2): return [1,1] next_series = lambda series,_: series + [series [-1] + series [-2]] return reduce(next_series,range(position - 2),[1,1])
我无法弄清楚Scala中的reduce相当于什么.这就是我现在拥有的.除了最后一行,一切正常.
def immutable_fibonacci(position: Int) : ArrayBuffer[Int] = { if (position == 1){ return ArrayBuffer(1) } if (position == 2){ return ArrayBuffer(1,1) } var next_series = (series: ArrayBuffer[Int]) => series :+ ( series( series.size - 1) + series( series.size -2)) return reduce(next_series,2 to position,ArrayBuffer(1,1)) }
解决方法
reduce
摘要,供参考:
reduce(function,iterable[,initializer])
穿越
一个好的类型是Traversable
,一个ArrayBuffer的超类型.您可能只想暂时阅读该API,因为那里有很多有用的东西.
降低
当省略初始化器arg时,相当于Python的reduce是Scala的Traversable[A]#reduceLeft
:
reduceLeft[B >: A](op: (B,A) => B): B
Python函数的可迭代arg对应于Traversable实例,Python函数的函数arg对应于op.
请注意,还有一些名为reduce,reduceRight,reduceLeftOption和reduceRightOption的方法,它们相似但略有不同.
折
您的示例提供了初始化程序arg,对应于Scala的Traversable[A]#foldLeft
:
foldLeft[B](z: B)(op: (B,A) => B): B
Python函数的初始化程序arg对应于foldLeft中的z arg.
再次注意,有一些名为fold和foldRight的相关方法.
斐波那契
在不更改算法的情况下,这里是代码的清理版本:
def fibonacci(position: Int): Seq[Int] = position match { case 1 => Vector(1) case 2 => Vector(1,1) case _ => (2 to position).foldLeft(Vector(1,1)) { (series,_) => series :+ (series(series.size - 1) + series(series.size - 2)) } }
一些杂项说明:
>我们通常不会使用return关键字
>模式匹配(我们使用匹配关键字做的事情)通常被认为比if-else链更干净
>尽可能将val(允许多次赋值)替换为val(不允许)
>如果您不需要,请不要使用可变集合(ArrayBuffer). Vector是一个很好的通用不可变序列.
虽然我们讨论的是集合和Fibonacci系列,但为了好玩,您可能需要查看Stream
文档中的第一个示例:
val fibs: Stream[BigInt] = BigInt(0) #:: BigInt(1) #:: fibs.zip(fibs.tail).map { n => n._1 + n._2 } fibs.drop(1).take(6).mkString(" ") // "1 1 2 3 5 8"
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。