文章目录

  • 递归与迭代
  • 递归消耗内存的缺点
  • 为什么要有迭代
  • 需要用迭代消解递归的情况
  • 不需要消解的递归
  • 结束语

递归与迭代

递归与迭代都是基于控制结构:迭代用重复结构,而递归用选择结构。递归与迭代都涉及重复:迭代显式使用重复结构,而递归通过重复函数调用实现重复。递归与迭代都涉及终止测试:迭代在循环条件失败时终止,递归在遇到基本情况时终止。使用计数器控制重复的迭代和递归都逐渐到达终止点:迭代一直修改计数器,直到计数器值使循环条件失败;递归不断产生最初问题的简化副本,直到达到基本情况。迭代和递归过程都可以无限进行:如果循环条件测试永远不变成false,则迭代发生无限循环;如果递归永远无法回推到基本情况,则发生无穷递归。

递归消耗内存的缺点

递归有许多缺点,它重复调用机制,因此重复函数调用的开销很大,将占用很长的处理器时间和大量的内存空间。每次递归调用都要生成函数的另一个副本(实际上只是函数变量的另一个副本).从而消耗大量内存空间。迭代通常发生在函数内,因此没有重复调用函数和多余内存赋值的开销。那么,为什么选择递归呢?

为什么要有迭代

递归算法表示许多问题的求解方法时算法思想非常简洁。但是递归算法不仅时间效率非常差,而且由于递归算法是不断的函数调用和函数返回过程,因此其实际的计算机运行时间通常远大于循环方式算法的计算机运行时间,甚至在有限的时间内无法求解。这就存在一个把递归算法化为非递归算法的问题。

需要用迭代消解递归的情况

递归算法特别适合于所研究的问题或所处理的数据本身是递归定义的情况。然而,并不意味着这种递归定义保证递归算法是解决该问题的最好方法。事实上,主要是因为拿那种不合适的例子来解释递归算法概念,从而造成了对程序设计中使用递归的普遍怀疑和否定态度,并把递归同低效等同起来。而且在递归算法中,往往会因为追求代码短或者在求解问题时一味追求规律性,多用了无用的压栈和出栈的操作。比如用循环消解的尾递归,是多了无用的压栈和出栈才使速度受损的;斐波那契数列计算的递归改循环迭代所带来的速度大幅提升,是因为改掉了重复计算的毛病。假使一个递归过程中本身包含了大量冗余的操作,并且这个过程又可以用迭代来达到相同的效果。这时,我们就一般用迭代来消解递归。也就是说尾递归算法和单向递归算法可用迭代算法来代替。

不需要消解的递归

那种盲目的消解递归,不惜一切代价躲避递归,认为“递归的速度慢,为了提高速度,必须用栈或者其他的方法来消解”的说法是很片面的。如果一个递归过程用非递归的方法实现后,速度提高了,那只是因为递归做了一些无用功。假使一个递归过程必须要用栈才能消解,那么完全模拟后的结果根本就不会对速度有任何提升,只会减慢;如果你改完后速度提升了,那只证明你的递归函数写的有问题,如多了许多重复操作——打开关闭文件、连接断开数据库,而这些完全可以放到递归外面。可以在本质上是非递归的机器上实现递归过程这一事实本身就证明:为着实际目的,每一个递归程序都可以翻译成纯粹迭代的形式,但这包含着对递归栈的显式处理,而这些运算常常模糊了程序的本质,以致使它非常难以理解。
因此,是递归的而不是迭代的算法应当表述成递归过程。如汉诺塔问题等。汉诺塔问题的递归算法中有两处递归调用,并且其中一处递归调用语句后还有其他语句,因此该递归算法不是尾递归或单向递归。要把这样的递归算法转化为非递归算法,并没有提高程序运行的速度,反而会使程序变得复杂难懂,这是不可取的。也就是说,很多递归算法并不容易改写成迭代程序:它们本质上是递归的,没有简单的迭代形式。这样的递归算法不宜转化为非递归算法。

结束语

说到底,在我们选择算法时应该全面分析算法的可行性、效率、代码优化。在综合了算法的各个因素后,选择合适的算法来编写程序,这样的程序才会达到优化的效果。

【思维风暴】算法迭代和递归的理解相关推荐

  1. 迭代和递归的理解和区别

    最近做一些题经常会碰到迭代的方法解的,或者递归解法,容易搞混,特在此整理一下 一.递归: 由例子引出,先看看递归的经典案例都有哪些 1.斐波那契数列 斐波纳契数列,又称黄金分割数列,指的是这样一个数列 ...

  2. 斐波那契数的两种求法(迭代,递归)

    **斐波那契数,通常用 F(n) 表示,形成的序列称为斐波那契数列.该数列由 0 和 1 开始,后面的每一项数字都是前面两项数字的和.也就是: F(0) = 0, F(1) = 1 F(N) = F( ...

  3. 计算机科学中的递归算法是把问题,从计算思维的视角辨析算法中的递归与迭代...

    周世杰 算法思维是计算思维的一个方面,而在计算机科学中,基于递归和迭代的思维方式在算法和程序设计中广泛应用,是算法思维的重要构成部分.因此,信息技术学科教师在基础课教学中辨析递归与迭代算法,将其作为发 ...

  4. 基础算法(二):迭代、递归与分治

    前言 在这篇文章中,荔枝会梳理一些迭代.递归和分治的基本概念.同时也会有样题示例辅助理解这三种算法的应用. 文章目录 前言 一.迭代 1.1 概念 1.2 样题示例 二.递归 2.1 概念 2.2 样 ...

  5. Java常用算法——迭代 递归篇

    迭代 & 递归 迭代 (1).定义 来自维基百科: 迭代是重复反馈过程的活动,其目的通常是为了接近并到达所需的目标或结果.每一次对过程的重复被称为一次"迭代",而每一次迭代 ...

  6. 关于函数递归和函数迭代,我的理解

    在C语言里函数递归是什么呢?我的理解是函数自己调用自己,但是不能一直调用,有限制条件,当满足限制条件后,函数停止调用.说到这我就想说一下我对函数的理解,函数我理解为实现某种功能的一串代码,由于函数讲究 ...

  7. 对分查找算法(迭代和递归方式)

    对分查找算法(迭代和递归方式) 二分查找法是对一组有序的数字中进行查找,传递相应的数据,进行比较查找到与原数据相同的数据,查找到了返回对应的数组下标,失败返回-1. 迭代方式 public stati ...

  8. ​相似算法比较:递归、分治、动态规划、贪心、回溯、分支限界​

    相似算法比较:递归.分治.动态规划.贪心.回溯.分支限界 ​ 在学习算法的过程中,递归.分治.动态规划.贪心.回溯.分支限界这些算法有些类似,都是为了解决大问题,都是把大问题拆分成小问题来解决,但她们 ...

  9. Java中的迭代与递归

    递归 提到迭代,不得不提一个数学表达式: n!=n*(n-1)*(n-2)*...*1 有很多方法来计算阶乘.有一定数学基础的人都知道n!=n*(n-1)!因此,代码的实现可以直接写成: 代码一 in ...

最新文章

  1. spring获取webapplicationcontext,applicationcontext几种方法详解(转载)
  2. 2019年计算机一级考试pdf,2019年计算机一级考试试题与答案.pdf
  3. Sklearn-train_test_split随机划分训练集和测试集
  4. OCM备考 三. Managing Database Availability 之RMAN高级操作
  5. 【CF#757A】Gotta Catch Em' All!
  6. 给刚入行的存储工程师10+1点建议
  7. C do...while 循环
  8. 红帽Redhat网络功能虚拟化产品指南、规划和配置指南
  9. 【PHP基础】PHP接口调用与json数据处理
  10. vc中控件字体的设置(转)
  11. selenium 12306登录滑块验证码
  12. NavigationDuplicated: Avoided redundant
  13. Java - 从零学起(二)
  14. 【漆天编程】最牛逼的均线交叉指标,做出了EA历史数据测试器的效果
  15. Java的全局异常处理(统一异常处理)+登陆拦截鉴权+注解实现记录日志
  16. 计算机知识竞赛 翻译,英文简历之常见学科竞赛中英文翻译
  17. 有了这个抠图滤镜,设计师再也不怕扣头发婚纱了!
  18. Java在手机平台上的Porting
  19. 共享软件作者怎样才能月入万
  20. 怎么打开ofd文件的三种方法

热门文章

  1. sdkmanager工具安装
  2. 动力节点Redis学习笔记
  3. c# indexof方法_清单 .IndexOf()方法,以C#为例
  4. java aud 转mp3_‎App Store 上的“音频提取器 - mp3音频转换器,音视频转换”
  5. Linux新手之路 - date cal 命令
  6. PPT是什么的缩写?
  7. 一篇文搞懂《AOP面向切面编程》是一种什么样的体验?
  8. c语言判断奇数偶数_使用C语言宏检查偶数或奇数
  9. 评估区块链性能的要素
  10. LTE-PHY物理资源划分(一)