为了练习目的,我一直试图以功能方式实现一对Scala的List方法,其中之一是partition
。假设以下特征:Scala列表分区方法的尾递归实现
def partition[T](l: List[T], f: T => Boolean): (List[T], List[T])
它返回一个包含两个列表的元组 - 第一个包含了所有从l
那些符合通过谓语f
,另一个包含所有其他元素的元素。
我想出了下面的递归解决方案,它是不幸的是没有尾递归:
def partition[T](l: List[T], f: T => Boolean): (List[T], List[T]) = {
l match {
case Nil => (Nil, Nil)
case head :: rest => {
val (left, right) = partition(rest, f)
if (f(head))
(head :: left, right)
else
(left, head :: right)
}
}
}
在这个堆栈溢出问题(Can all recursive functions be re-written as tail-recursions?)则明确表示,蓄能器可能在某些情况下使用。在给定的一个中,我会声称这是不可能的,因为它会以相反的方式返回最终列表。
你能给我一个尾递归解决方案吗?也许即使延续传球(我还没有真正理解它是如何工作的以及如何应用的)?
您可以在返回结果之前将结果反转。 – Dima