scala中有没有一个与python reduce()函数等效的函数?

2024-04-20 09:14:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我刚刚开始学习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的等价物是什么。这就是我目前所拥有的。除了最后一行,一切都很好。在

^{pr2}$

Tags: lambda函数reducereturnifdef编程position
1条回答
网友
1楼 · 发布于 2024-04-20 09:14:15

Python^{}摘要,供参考:

reduce(function, iterable[, initializer])

可穿越

一个好的类型是^{},它是ArrayBuffer的超类型。你可能只需要仔细研究一下这个API,因为里面有很多有用的东西。在

减少

当省略initializer参数时,Python的reduce是Scala的^{}

^{pr2}$

Python函数中的iterable参数对应于Traversable实例,Python函数中的function参数对应于{}。在

注意,还有一些名为reducereduceRightreduceLeftOption和{}的方法,它们相似,但略有不同。在

折叠

您的示例提供了一个initializer参数,它对应于Scala的^{}

foldLeft[B](z: B)(op: (B, A) => B): B

Python函数中的initializer参数对应于foldLeft中的z参数。在

再次注意,有一些相关的方法被命名为fold和{}。在

斐波那契

在不更改算法的情况下,以下是代码的清理版本:

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关键字
  • 模式匹配(我们使用match关键字所做的)通常被认为比if-else链更干净
  • 尽可能将var(允许多个赋值)替换为val(不允许)
  • 如果不需要,请不要使用可变集合(ArrayBuffer)。Vector是一个很好的通用不可变序列。在

当我们讨论集合和斐波纳契系列时,为了好玩,您可能想看看^{}文档中的第一个示例:

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"

相关问题 更多 >