1.递归与非递归的区别:

递归的代码量比非递归的代码量少,因为非递归需要额外的变量记录当前所处的位置信息,以及额外的控制语句。而递归所使用的方式是函数调用,这是非常自然的栈结构,不需要记录位置信息,不需要添加控制语句,这些工作都由函数调用的特性解决了。

递归的执行效率比非递归的执行效率低,因为递归的实质是函数调用,而函数调用必然要进行线程栈空间的分配,记录每一次函数调用前的状态等工作,开销是比较大的。而非递归则不需要进行这些工作。

递归与非递归调用最主要区别就是在函数调用上。在计算机的工作方式中,函数调用是以栈结构来实现的,最早调用的函数处于栈底,最晚调用的函数处于栈顶,栈中存放的是每个函数中的局部变量等信息,当函数调用返回时该函数相关的信息就会从栈中弹出。

由此可以看出,递归每深入一层,栈的深度也会加一,而且当每一层的递归调用结束,都会自动返回上一层的递归中,因此不需要额外的变量记录当前所处的递归位置,也不需要while、if等控制语句进入或返回上一层或下一层递归。因此代码量比非递归的少。

但正因为函数调用要在栈中进行各种操作,例如分配新的空间,保存当前函数调用的信息,为新的函数调用初始化等,效率比较低下。所以递归的效率比非递归的低。

2.转化

递归是指某个函数或过程直接或间接的调用自身。一般地一个递归包括递归出口和递归体两部分,递归出口确定递归到何时结束,而递归体确定递归求解时的递推关系。递归算法有两个基本特征:一是递归算法是一种分而治之的、把复杂问题分解为简单问题的求解问题方法,对于求解某些复杂问题,递归算法分析问题的方法是有效地;而是递归算法的时间、控件效率通常比较差。因此对解决某些问题时,我们希望用递归算法分析问题,用非递归算法解决问题,这就需要把递归算法转换为非递归算法。

把递归算法转化为非递归算法有如下三种基本方法:

(1). 通过分析,跳过分解过程,直接用循环结构的算法实现求解过程。

(2). 自己用栈模拟系统的运行时栈,通过分析只保存必须保存的信息,从而用非递归算法替代递归算法。

(3). 利用栈保存参数,由于栈的后进先出特性吻合递归算法的执行过程,因而可以用非递归算法替代递归算法。

3.分析

递归深度小于3的,优化结果不明显。大于3的,优化后差距能达到70%以上。

目前QQ超市1店5口,以后2店3口之后的图,递归深度甚至达到了60层。

经过测试发现路径算出速度低了10多倍。非递归的转换势在必行!!

要回去从头学一下二叉树了……

转载于:https://www.cnblogs.com/youki/archive/2012/03/18/2404531.html

将递归算法改为非递归算法相关推荐

  1. 递归算法转化为非递归算法

    (1)直接用循环结构的算法替代递归算法(直接转化法,不需要使用栈) (2)用栈模拟系统的运行过程,通过分析只保存必须保存的信息,从而用非递归方法替代递归算法.(间接转化法,需要使用栈) 用循环结构替代 ...

  2. 递归算法转换成非递归算法

    这周,一个同事在开发这样一个功能:把java对象转换成JSON格式的字符串,我知道有开源的jar包,但是他说那个不能处理他目前的需要,所以需要开发一套转换方法.看了他画的流程图,实在看不懂,就给他提了 ...

  3. 数据结构 | 二叉树 先根、中根、后根遍历的非递归算法

    上期文章: 数据结构 | 树与二叉树 参考教材:<数据结构>,刘大有 编程语言: C++ 目录 (一)二叉树的存储结构 (二)二叉树的遍历 先根遍历非递归算法 中根遍历非递归算法 后根遍历 ...

  4. 递归算法与非递归算法比较

    转载自:https://blog.csdn.net/mhsszm/article/details/78445591 非递归效率高:递归代码写出来思路清晰,可读性强. 生成可执行文件大小应该和编译器有关 ...

  5. 4.二叉搜索树转为有序双向链表(递归算法与非递归算法)

    一.题目 要求输入一棵二叉搜索树,将该二叉搜索树转换成一个排序的双向链表.要求不能创建新的节点,只能调整树中结点指针的指向. 二叉树结点定义如下: 1 struct BinaryTreeNode 2 ...

  6. 二叉树遍历的非递归算法

    大一下半期数据结构 知识点 递归算法虽然简单,但一般而言,其执行效率并不高.对于二叉树的遍历操作,可以仿照递归算法执行过程中工作栈的状态变化得到非递归算法. 一.前序遍历非递归算法 二叉树前序遍历非递 ...

  7. Ackerman的非递归算法思路讲解

    简介 本文参考:https://blog.csdn.net/sanqima/article/details/48831679 我结合我自己的一些思考写一下我的思路. 从上到下分别标记为1式.2式.3式 ...

  8. 非递归算法——快速排序、归并排序

    哈喽大家好,我是保护小周ღ,本期为大家带来的是常见排序算法中的快速排序.归并排序,非递归算法,分享所有源代码,粘贴即可运行,保姆级讲述,包您一看就会,快来试试吧~ 目录 一.递归的缺陷 1.1 栈是什 ...

  9. 后序遍历的非递归算法python_二叉树后序遍历(递归与非递归)算法C语言实现...

    二叉树后序遍历的实现思想是:从根节点出发,依次遍历各节点的左右子树,直到当前节点左右子树遍历完成后,才访问该节点元素. 图 1 二叉树 如图 1 中,对此二叉树进行后序遍历的操作过程为: 从根节点 1 ...

最新文章

  1. 吃瓜腾讯平均月薪7.27万后,微信又出大招
  2. Example017简单的下拉框
  3. 4、linux网络编程--套接字的介绍
  4. redis的scan命令的源码分析,实现原理
  5. mysql一对一修改_MYSQL的一对一
  6. 钉钉开发者接口文档_无需开发,IT事件接入钉钉的方法详解
  7. 如何在Java中转义JSON字符串-Eclipse IDE技巧
  8. java的empty_Java Stack empty()方法与示例
  9. Navicat premium查看数据库表中文注释的两种方式
  10. apktool 在mac下的使用 -反编译安卓apk文件
  11. nemesis什么车_马力2100匹《Trion Nemesis》谜样超跑诞生中?
  12. Leetcode每日一题:21.merge-two-sorted-lists(合并两个有序链表)
  13. selenium+python谷歌驱动配置
  14. 深度解析MFC线程及机制
  15. C# winForm启动最小化到任务栏右侧通知栏并交互操作
  16. nuxt SSR部署到iis7方案
  17. 计算机学院学生会招新宣传语,团学招新 | 计算机学院团委、学生会招新啦!(一)...
  18. 打开word2016文档时提示用文本恢复转换器打开文件
  19. python中iter函数_Python基础:iter函数的两个参数
  20. 实验四-1:输入一个字符,请判断是字母、数字还是其它字符。

热门文章

  1. IE浏览器CSS hack方式一览
  2. ceph存储 pg归置组处于stuck以及degraded状态解决方案
  3. selenium+Java切换窗口句柄
  4. 为什么架构师工资比运维高?
  5. Galgames Hgames下载中心,无毒
  6. 我在乐视9年,亲眼看贾跃亭一步步走向失控
  7. PS - 图层显示索引不能做修改(将索引图层改为正常图层)
  8. C语言:va_list的用法
  9. 中国做SaaS为什么这么难?
  10. 传播易7月发力 微信大号营销成为前锋