比acc.reverse更有效::: b?

时间:2013-02-06 22:00:07

标签: scala scala-collections

我正在优化递归函数。最后,结果将是acc.reverse ::: b。由于reverse:::,这是O(n)。是否有更好的表现方式来组合这两个列表?感谢。

实施例。将List(3, 2, 1)List(4, 5, 6)合并到List(1, 2, 3, 4, 5, 6)

1 个答案:

答案 0 :(得分:5)

标准库包含reverse_:::方法:

scala> List(3, 2, 1) reverse_::: List(4, 5, 6)
res0: List[Int] = List(1, 2, 3, 4, 5, 6)

这仍然是O(n),但是避免单独调用:::


为了有趣和学习,您可以轻松地将其实现为尾递归功能:

@tailrec
def reverseConcat[A](lefts: List[A], rights: List[A]): List[A] =
  lefts match {
    case Nil => rights
    case head::tail => reverseConcat(tail, head::rights)
  }

或使用foldLeft

def reverseConcat[A](lefts: List[A], rights: List[A]): List[A] =
  lefts.foldLeft(rights)((xs, x) => x :: xs)

请注意,reverse_:::未使用尾递归实现;它在幕后使用var,因此可能会有不同的表现。