【发布时间】:2012-02-12 08:40:21
【问题描述】:
我写了一个递归版本:
def quickSort[T](xs: List[T])(p: (T, T) => Boolean): List[T] = xs match{
case Nil => Nil
case _ =>
val x = xs.head
val (left, right) = xs.tail.partition(p(_, x))
val left_sorted = quickSort(left)(p)
val right_sorted = quickSort(right)(p)
left_sorted ::: (x :: right_sorted)
}
但我不知道如何将其更改为尾递归。谁能给我一个建议?
【问题讨论】:
-
你不能——算法的想法是把工作分解成更小的任务,递归地执行它们,然后把结果放在一起。因为后者必然是你在快速排序中做的最后一个事情,所以它不能是尾递归的。
-
这个类似的问题,但在 OCaml 中可能会有所帮助:stackoverflow.com/questions/5634083/…
-
解释的底层算法还是可以理解的。
-
"“分而治之”这个名称有时也用于将每个问题简化为仅一个子问题的算法,例如用于在排序列表中查找记录的二分查找算法(或其类似物数值计算,求根的二分算法)。[1]这些算法可以比一般的分治算法更有效地实现;特别是,如果它们使用尾递归,它们可以转换成简单的循环“en.wikipedia.org/wiki/Divide_and_conquer_algorithm
-
何必呢?快速排序算法一次最多只使用 O(log n) 个堆栈帧。
标签: algorithm scala data-structures tail-recursion