摘要
本文介绍用堆栈操作和while循环消除递归的一般方法。全文叙述详细,步骤清晰,还配有几个实例,非常适合新手程序员阅读和掌握。翻译自:How to replace recursive functions using stack and while-loop to avoid the stack-overflow,原作者:Woong Gyu La
译者的话
本科非计算机类数据结构课上学到递归的消除。多得此文的帮助,我初步理解了课上和书上介绍的用堆栈操作消除简单的递归的方法。现将此文介绍给社区。
注:因本人非相关专业,水平极其有限,如有译法不规范之处请评论指正。
用堆栈操作和while循环消除递归的一般方法
原题:How to replace recursive functions using stack and while-loop to avoid the stack-overflow
原作者:Woong Gyu La
背景
在某些情况下,人们更喜欢使用递归函数,例如在排序(如归并排序)或树操作(如调整建堆)时。但是,如果递归树在某些环境中(例如在Visual C++代码中)变得过深,则可能会发生意外的结果,例如栈溢出(stack-overflow)。许多专业开发人员可能已经懂得如何将递归过程替换为迭代过程,或使用栈(堆栈)和while循环来等效递归过程(即所谓的模拟递归函数),来避免可能的栈溢出问题。然而,作者认为应当介绍一个关于如何使用栈(堆栈)和while循环模拟递归过程的简单而通用的方法(或指南),以帮助新手开发人员避免栈溢出问题。
模拟递归的目的
当使用递归函数时,由于程序员无法控制系统栈的使用,而系统栈空间往往相当有限,因此当递归调用层次过深时,可能会发生栈溢出/堆损坏。模拟递归的目的是将原本在系统栈进行的递归过程等效到堆栈中进行,因此程序员可以对内存分配和递归过程进行更多控制,以避免栈溢出。如果将递归过程替换为迭代过程会更好,但要做到这一点,要求程序员花费时间和依赖个人经验,以恰当处理每个递归函数。因此,本文的目的是提供一个简单的指南,以帮助新手开发人员掌握处理由递归过深导致的栈溢出的一般方法。
未完待续
未完待续,请参看原文How to replace recursive functions using stack and while-loop to avoid the stack-overflow
原作者:Woong Gyu La
关于几种常见递归类型的简单示例
- 请下载 RecursiveToLoopSamples.zip。
- 解压缩。
- 用Visual Studio打开工程。
- 该示例工程是在Visual Studio 2008环境下开发的
- 示例工程包含:
- 线性递归示例
- 二分支递归示例
- 尾递归示例
- 相互调用的递归示例
- 嵌套递归的示例
使用许可
本文及附属源代码和文件使用MIT许可