请问递归实现一定能转为非递归实现吗?

来源:3-9 归并排序和快速排序的衍生问题

慕运维2948618

2022-06-23

感觉上是,但我又想不到如何用非递归的方式实现快速排序

写回答

1回答

liuyubobobo

2022-06-23

一定可以。一个通用的转换方式是自己建立一个栈来模拟系统栈的运转过程。


我在这个课程中介绍过这个方法:https://coding.imooc.com/class/82.html 

如果你购买过这个课程,可以参考这个课程的 6-2 和 6-3.


如果你没有购买过这个课程,可以自己研究一下这三个代码:https://github.com/liuyubobobo/Play-with-Algorithm-Interview/tree/master/06-Stack-and-Queue/Course%20Code%20(C%2B%2B)/03-Non-Recursive-Implementation-of-a-Recursive-Algorithm

这三个代码是使用自己模拟系统栈的方式来做树的前中后序遍历。通常教科书中的树的前中后序遍历,因为不完全是使用模拟系统栈的方式(尤其是后序遍历),所以他们的算法差距特别大。但是如果我们使用模拟系统栈的方式,他们的代码模式是高度统一的。(就像树的前中后序遍历的递归代码其实是高度统一的一样。)


如果你理解了这个方法,应该可以“很容易地”使用这种方式把任何递归代码(包括快排)写成非递归的形式。只要你的心中有那棵递归树就好。(很容易之所以打引号,是因为期待马良肯定还是比递归高。当你深入掌握递归以后,就会发现,计算机世界中的大量问题,使用递归去思考其逻辑,是远远比使用非递归简单的。这本身就是递归的意义。)


继续加油!:)

0
2
liuyubobobo
回复
慕运维2948618
也一定可以。循环结构是一定可以用递归表达的。大多数纯粹地函数是编程语言不支持循环结构,但是是图灵完备的。比如 Haskell 或者 Erlang。(或者在一些纯粹地函数语言中,虽然存在循环结构,但其本质是一个“语法糖”或者是一个用递归实现的“函数”。)
2022-06-23
共2条回复

算法与数据结构(C++版) 面试/评级的算法复习技能包

课程专为:短时间内应对面试、升职测评等艰巨任务打造

11187 学习 · 1614 问题

查看课程