如何将递归算法转换成对应的非递归算法

  • 原创
  • |
  • 浏览:1447
  • |
  • 更新:
  • |
  • 标签:软件 

如何将递归算法转换成对应的非递归算法?想知道怎么操作就一起来看看好了。

工具/原料

  • 电脑

方法/步骤

  1. 1

    尾递归函数是指函数的最后一个动作是调用函数本身的递归函数,是递归的一种特殊情形。

     

    如何将递归算法转换成对应的非递归算法
  2. 1
    该信息未经授权抓取自百度经验
  3. 2

    为什么尾递归可以做到常量栈空间,我们用著名的fibonacci数列作为例子来说明。fibonacci数列实现方法一般是这样的。

    如何将递归算法转换成对应的非递归算法
  4. 3

    但是,这个实现方式不是尾回归,尾回归的最后的动作必须是呼叫本身,这里的最后的动作是加法操作,所以需要注意修正。  

    如何将递归算法转换成对应的非递归算法
  5. 4

    现在,已满足尾随递归定义。 使用-o和-o2选项编译gcc。 以下是一些汇编程序代码。-O2汇编代码。

    如何将递归算法转换成对应的非递归算法
  6. 5

    -O汇编代码。

    如何将递归算法转换成对应的非递归算法
  7. 6

    除了尾递归,斐波那契级数可以容易地引导环路的实现。

    如何将递归算法转换成对应的非递归算法
  8. 7

    尽管编译器无法自动优化常规递归函数,但通过模拟递归函数,可以使用栈将任何递归函数转换为迭代函数。 直观地说,递归过程实际上是帮助编译器按下或卸载栈。 要转换为迭代函数,必须手动推入和卸载堆栈。

    如何将递归算法转换成对应的非递归算法
  9. 8

    快速排序递归算法是一个二叉树的主扫描过程,它首先处理当前根节点,然后处理左子树和右子树。 将快速排序递归算法转换为非递归与将二叉树的主扫描递归算法转换为非递归算法相同。  二叉树先序遍历递归算法伪码

    如何将递归算法转换成对应的非递归算法
  10. 9

    二叉树先序遍历非递归伪码

    如何将递归算法转换成对应的非递归算法
  11. 10

    每次处理当前节点时,都会堆叠右子树和左子树。 同样,您可以轻松实现非递归算法以加快排序速度。 Partition:向左或向右拆分阵列。 这相当于处理当前节点。 下一步是将左右子树放入堆栈中。 哪些信息需要存储在左右子树中? 这是处理非递归函数的关键,因为必须将调用函数的信息推入栈中。 快速排序只需要保留子阵列的边框。  

    如何将递归算法转换成对应的非递归算法
    END

总结

  1. 1

    1、尾递归函数是指函数的最后一个动作是调用函数本身的递归函数,是递归的一种特殊情形。

    2、为什么尾递归可以做到常量栈空间,我们用著名的fibonacci数列作为例子来说明。fibonacci数列实现方法一般是这样的。

    3、但是,这个实现方式不是尾回归,尾回归的最后的动作必须是呼叫本身,这里的最后的动作是加法操作,所以需要注意修正。  

    4、现在,已满足尾随递归定义。 使用-o和-o2选项编译gcc。 以下是一些汇编程序代码。-O2汇编代码。

    5、-O汇编代码。

    6、除了尾递归,斐波那契级数可以容易地引导环路的实现。

    7、尽管编译器无法自动优化常规递归函数,但通过模拟递归函数,可以使用栈将任何递归函数转换为迭代函数。 直观地说,递归过程实际上是帮助编译器按下或卸载栈。 要转换为迭代函数,必须手动推入和卸载堆栈。

    8、快速排序递归算法是一个二叉树的主扫描过程,它首先处理当前根节点,然后处理左子树和右子树。 将快速排序递归算法转换为非递归与将二叉树的主扫描递归算法转换为非递归算法相同。  二叉树先序遍历递归算法伪码

    9、二叉树先序遍历非递归伪码

    10、每次处理当前节点时,都会堆叠右子树和左子树。 同样,您可以轻松实现非递归算法以加快排序速度。 Partition:向左或向右拆分阵列。 这相当于处理当前节点。 下一步是将左右子树放入堆栈中。 哪些信息需要存储在左右子树中? 这是处理非递归函数的关键,因为必须将调用函数的信息推入栈中。 快速排序只需要保留子阵列的边框。  

    END
经验内容仅供参考,如果您需解决具体问题(尤其法律、医学等领域),建议您详细咨询相关领域专业人士。
作者声明:本篇经验系本人依照真实经历原创,未经许可,谢绝转载。
展开阅读全部
相关标签软件