首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么快速排序被称为尾部递归算法?

为什么快速排序被称为尾部递归算法?
EN

Stack Overflow用户
提问于 2012-08-08 11:57:15
回答 3查看 5.6K关注 0票数 6

我知道什么是尾部递归算法作为写在这个答案里。然而,我正在研究这个MIT快速排序算法视频,在18:30秒,教授说这是尾部递归算法。我无法连接这是如何进行尾递归的。我们没有在递归的任何一步进行计算,或者我们是在做计算?你能解释一下为什么这被引用为尾部递归算法的一个例子吗?请将你的答案建立在这样一个前提之上:我知道递归算法是什么。我不清楚的部分是为什么它被称为尾递归?

EN

回答 3

Stack Overflow用户

发布于 2012-08-08 12:25:23

尾递归不是分步骤计算的。它是关于“可以在不构建调用堆栈的情况下计算递归”。什么是尾递归?给出的例子就是这方面的一个特殊情况。如果你更深入地研究这个例子,你会发现

代码语言:javascript
复制
def recsum(x):
 if x==1:
  return x
 else:
  return x+recsum(x-1)

1)要成功运行上述代码,需要构建调用堆栈。但,

代码语言:javascript
复制
def tailrecsum(x,running_total=0):
  if x==0:
    return running_total
  else:
    return tailrecsum(x-1,running_total+x)

2)要运行上述代码,不需要因为running_total而构建调用堆栈。只需为“原始调用”和递归构建调用堆栈,就不需要构建调用堆栈,因为计算此函数所需的状态存储在running_total中。

关于快速排序,我认为教授可能意味着快速排序可以通过“使用”尾记忆来优化。对于qsort()的两个分支部分,我们可以在具有较高项的一侧使用尾递归(基于枢轴位置)。

票数 7
EN

Stack Overflow用户

发布于 2012-08-08 12:25:45

查看一下快速排序的wiki页面。有一个版本的尾递归

代码语言:javascript
复制
 function quicksort(array, 'left', 'right')

  // If the list has 2 or more items
  if 'left' < 'right'

      // See "Choice of pivot" section below for possible choices
      choose any 'pivotIndex' such that 'left' ≤ 'pivotIndex' ≤ 'right'

      // Get lists of bigger and smaller items and final position of pivot
      'pivotNewIndex' := partition(array, 'left', 'right', 'pivotIndex')

      // Recursively sort elements smaller than the pivot
      quicksort(array, 'left', 'pivotNewIndex' - 1)

      // Recursively sort elements at least as big as the pivot
      quicksort(array, 'pivotNewIndex' + 1, 'right')

根据尾递归的定义,quicksort的最后一个方法调用是它本身,即尾递归。但其他一些实现不是尾递归的。

代码语言:javascript
复制
 quicksort(left) + pivot + quicksort(right)

因为quicksort中的最终动作sorted_left + pivot + sorted_right

票数 4
EN

Stack Overflow用户

发布于 2012-08-08 12:02:11

递归函数的第一步是分区。然后,作为最后一步,调用两个分区上的递归函数。

维基百科:

在计算机科学中,尾调用是在另一个过程中发生的子例程调用,作为它的最终动作;它可能产生一个返回值,然后由调用过程立即返回。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11864006

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档