微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

scala中是否有等效的python reduce()函数?

我刚开始学习 Scala函数式编程,我正在尝试将以下内容Python转换为Scala:

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))
}

解决方法

Python 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 举报,一经查实,本站将立刻删除。

相关推荐