首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >快速排序的尾部调用优化

快速排序的尾部调用优化
EN

Stack Overflow用户
提问于 2015-01-22 19:34:13
回答 1查看 885关注 0票数 0

我只是进入TCO,我理解它如何重用单个堆栈框架的概念,而不是每次方法调用自己时创建一个新的堆栈框架。我直觉地希望将此结构与while循环进行比较,因为循环将继续对一组变量执行操作,直到不满足条件为止。

但是,考虑到TCO只使用一个堆栈帧,似乎不可能执行排序算法,例如快速排序,一旦达到基本情况后,递归方法就需要将TCO作为堆栈帧的引用来执行排序算法。如果不引用该方法被调用的次数,它如何知道要执行哪个后续操作以及执行多少次?

假设每个调用的方法主体是相同的,我猜它只需要保持对方法被调用的次数的引用,然后在方法主体内的指针开始执行,但这只是猜测。

谢谢你的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-01-22 19:45:08

只要递归调用处于最后位置,就可以执行TCO。快速排序需要两个递归调用,因此很明显它们不可能都处于这个位置--但其中一个可以,这样就可以将尾调用转换为while循环:

原件(伪码):

代码语言:javascript
复制
quicksort(i, j) {
    return if j <= i
    k = getPivot(i, j)
    partition(i, j, k)
    quicksort(i, k-1)    <--- This recursive call can't be changed
    quicksort(k+1, j)    <--- This recursive call is amenable to TCO
}

TCO之后:

代码语言:javascript
复制
quicksort(i, j) {
    while (j > i) {
        k = getPivot(i, j)
        partition(i, j, k)
        quicksort(i, k-1)    <--- This recursive call is unchanged
        i = k+1
    }
}

以相反的顺序调用它们也是可行的。

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

https://stackoverflow.com/questions/28097179

复制
相关文章

相似问题

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