用栈将递归转换成非递归

Posted guanghui-hua

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用栈将递归转换成非递归相关的知识,希望对你有一定的参考价值。

我们都知道递归函数是通过堆栈实现的。那在实际代码过程中,有没有一套可行的规则,把常见的递归函数写成显式的非递归形式(外加一个堆栈stack 数据结构)呢?

如何用栈实现递归和非递归的转换

递归如何转换成非递归

  1. 为什么要讲递归呢?

    因为递归很复杂,需要很长时间,见识过很多例子,包括了解好多数据结构才能深刻体会到如何使用递归,有时候,我们也不知道是否可以使用还是不能使用递归,其实可以通过非递归思想去理解,然后通过递归算法来进行编程实现,都是一个很好的方向,递归的本质是栈。

  2. 递归一般使用栈和队列使用区别?

    通过很多例子发现凡是使用深度优先都是使用递归算法,凡是使用层次遍历的使用的都是队列。这个让我们怎么理解,我个人发现一个小的情况就是,递归它一般都是有一定的关系的,如深度优先遍历,它都是一个结点和另外一个结点之间有连接关系。这样才可以深度遍历,一直可以向下遍历。纵观层次遍历,它们之间没有什么关系,所以可以使用队列来遍历。

  3. 递归还分为单支递归和多支递归?

    单支递归一个方向的,就是一个递归调用,多支递归可以有多个递归调用。一个递归调用,他可以通过普通循环来实现,并且不用进行回溯,它用临时变量来保存结果的,普通循环可以完成的。(但是递归底层运行时候,是进行自底向上的),多支递归是要进行回溯的,它使用栈来保存中间结果的,需要通过循环栈来实现。

  4. 递归从外部看,以及转化成非递归,在外部看来是由上至下,从内部看是由下至上的,我们分析问题时,和写代码都是站在外部看。

  5. 经典讲解,请看http://www.linuxidc.com/Linux/2014-06/102934.htm

本文出自 “简答生活” 博客,转载请与作者联系!

以上是关于用栈将递归转换成非递归的主要内容,如果未能解决你的问题,请参考以下文章

递归如何转换成非递归

最新情报:所有的递归都可以改写成非递归?

最新情报:所有的递归都可以改写成非递归?

最新情报:所有的递归都可以改写成非递归?

面试题 08.06. 汉诺塔问题(非递归实现汉诺塔问题)

用栈来递归 模板 honoi