原标题:什么是递归?什么是迭代?

先讲个故事吧。

从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?“从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?‘从前有座山,山里有座庙,庙里有个老和尚,正在给小和尚讲故事呢!故事是什么呢?……’”。

这个故事永远也讲不完,因为没有递归结束条件。老师讲递归时总是说,递归很简单,一个递归结束条件,一个自己调用自己。如果递归没有结束条件,那么就会无限递归下去。在编程的时候,没有递归结束条件或者递归过深,一般会造成栈溢出。

递归算法一般用于解决三类问题:

(1)数据的定义是按递归定义的。(Fibonacci函数)

(2)问题解法按递归算法实现。(回溯)

(3)数据的结构形式是按递归定义的。(树的遍历,图的搜索)

迭代算法是用计算机解决问题的一种基本方法。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或这些步骤)时,都从变量的原值推出它的一个新值。

为什么使用迭代而不用递归呢?

很明显,使用递归时每调用一次,就需要在栈上开辟一块空间,而使用迭代就不需要了,因此,很多时候设计出了递归算法,还要想法设法修改成迭代算法。

假如现在我们不考虑编程,我们仅仅看一下上面使用递归和迭代求1+2+3…+n的过程。

使用递归:

sum(5)

5+sum(4)

5+4+sum(3)

5+4+3+sum(2)

5+4+3+2+sum(1)

5+4+3+2+1+sum(0)

5+4+3+2+1+0

5+4+3+2+1

5+4+3+3

5+4+6

5+10

15

使用迭代

0+1=1

1+2=3

3+3=6

6+4=10

10+5=15

上面两个计算过程所需的步骤都是O(n)。但是两个计算过程的形状不一样。

递归过程是一个先逐步展开而后收缩的形状,在展开阶段,这一计算过程构造起一个推迟进行的操作所形成的的链条(这里是+),在收缩阶段才会实际执行这些操作。这种类型的计算过程由一个推迟执行的运算链条刻画,称为一个递归计算过程。要执行这种计算过程,就需要维护以后将要执行的操作的轨迹。在计算1+2+3+…+n时,推迟执行的加法链条的长度就是为了保存其轨迹需要保存的信息量,这个长度随着n值而线性增长,这样的过程称为线性递归过程。

迭代过程的形成没有任何增长或收缩。对于任意一个n,在计算的每一步,我们需要保存的就只有i,ret,这个过程就是一个迭代计算过程。一般来说,迭代计算过程就是那种其状态可以用固定数目的状态变量描述的结算过程。在计算1+2+…+n时,所需的计算步骤与n成正比,这种过程称为线性迭代过程。

程序调用自身的编程技巧称为递归( recursion)。递归做为一种在中广泛应用。 一个过程或在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。递归的能力在于用有限的来定义对象的。一般来说,递归需要有边界条件、递归前进段和递归返回段。当边界条件不满足时,递归前进;当边界条件满足时,递归返回。

迭代是重复反馈过程的活动,其目的通常是为了逼近所需目标或结果。每一次对过程的重复称为一次“迭代”,而每一次迭代得到的结果会作为下一次迭代的初始值。

递归与迭代都是基于控制结构:迭代用重复结构,而递归用选择结构。

举个例子吧:你要给某个小孩子买玩具。

递归:你自己不太了解小孩子的需求,为了缩小范围,让你的儿子去给孙子挑选。儿子比你强点有限,但依然不太了解小孩子的需求。为了缩小范围,你又让你孙子去挑选。如此这般,直到找到合适的玩具。

迭代:你挑了一件觉得不行,又挑了一件又不行。如此这般,直到找到合适的玩具。

所以一句话:递归是自己调用自己,每次旨在缩小问题规模。迭代是自己执行很多次,每次旨在更接近目标。

迭代是逐渐逼近,用新值覆盖旧值,直到满足条件后结束,不保存中间值,空间利用率高。

递归是将一个问题分解为若干相对小一点的问题,遇到递归出口再原路返回,因此必须保存相关的中间值,这些中间值压入栈保存,问题规模较大时会占用大量内存。返回搜狐,查看更多

责任编辑:

什么是迭代计算机编程,什么是递归?什么是迭代?相关推荐

  1. 计算机编程术语(中英文对照)

    abstract 抽象的 抽象的 abstraction 抽象体.抽象物.抽象性 抽象体.抽象物.抽象性 access 存取.取用 存取.访问 access level 存取级别 访问级别 acces ...

  2. 101条伟大的计算机编程名言

    "人们总是害怕改变.电被发明出来的时候他们害怕电,是不是?他们害怕煤,害怕蒸汽机车.无知无所不在,并导致恐惧.但随着时间推移,人们终究会接受最新的科技." 正如比尔盖茨曾经警告过一 ...

  3. 101条经典幽默的计算机编程名言

    如果您喜欢这些文章,欢迎点击此处订阅本Blog <script type="text/javascript"></script> <script sr ...

  4. 101条伟大的计算机编程名言 [ROYcms!NT]

    为什么80%的码农都做不了架构师?>>>    作者: 杜耀辉 发表于 2009-11-09 11:33 原文链接 阅读: 45 评论: 0 boxi译 "人们总是害怕改变 ...

  5. 《JavaScript函数式编程思想》——递归

    第7章  递归 王二.张三和赵四一日无聊,决定玩击鼓传花讲冷笑话的游戏.王二和张三围成一圈传花,赵四负责击鼓.张三接连讲了几个诸如小菜.狐狸狡猾的笑话.花停在了王二的手中. 王二:这个笑话很短.你要保 ...

  6. 迭代(iterate)和递归(recursion)的区别

    斐波那契函数为例: 递归 | | 栈 | | :(重复多次调用程序或函数本身) int fib(int n){ if(n>1) return fib(n-1) + fib(n-2); else ...

  7. 计算机编程课程顺序_您可以在6月开始参加630项免费的在线编程和计算机科学课程...

    计算机编程课程顺序 Six years ago, universities like MIT and Stanford first opened up free online courses to t ...

  8. 计算机编程课程顺序_九月份可以开始提供650多种免费的在线编程和计算机科学课程

    计算机编程课程顺序 Seven years ago, universities like MIT and Stanford first opened up free online courses to ...

  9. 计算机编程课程顺序_620多个免费的在线编程和计算机科学课程,您可以在三月开始

    计算机编程课程顺序 Six years ago, universities like MIT and Stanford first opened up free online courses to t ...

最新文章

  1. 十大Intellij IDEA快捷键转
  2. 事实证明,OpenCV中对RGB图像数据的存储顺序是BGR,而且Scalar()的顺序也是B,G,R
  3. 10分钟零基础带你入门Ribbon小项目-啥?小白都能看懂?
  4. OpenStack——基于EXSI安装OpenStack解决方案
  5. jenkins配置以cygwin环境的子节点
  6. 201512-5 矩阵
  7. gddr6速率_Rambus展示18GT/s的GDDR6内存子系统:高频信号纯净度仍然非常好
  8. python redis订阅_Python 学习笔记 - Redis
  9. Python高并发应用场景下四种写入SQLite数据库的速度比较
  10. Kubernetes的Service外部访问方式:NodePort和LoadBalancer
  11. 【Python】调用WPS V9 API,实现Word转PDF
  12. Web3D软件WebMax正式版发布
  13. java 随机生成中文姓名 工具类
  14. 51单片机非阻塞串口中断收发数据
  15. 基于腾讯人口迁徙数据的全国城市网络结构特征分析
  16. 0-5V转4-20mA信号隔离器、0-10V转换器、直流模块
  17. 即兴小探华为开源行业领先大数据虚拟化引擎openLooKeng
  18. Activity跳转后自动执行了onDestroy
  19. 为什么mac电脑识别不出来u盘?macbook识别不了u盘的解决办法
  20. Elasticsearch创建一个索引怎么也这么复杂

热门文章

  1. 扩展UbuntuTouch根目录,解决安装空间不足的问题
  2. Python学习笔记3.2-python内置函数大全
  3. 阿里云OSS图片文件和html文件无法直接打开,只能下载
  4. javaweb_笔记1(系统架构;servlet分析,注册,生命周期;Servletconfig对象(四个方法)和Servletcontext对象;http协议,get,post)
  5. 全网多种方法解决未连接到互联网 代理服务器出现问题,或者地址有误的错误
  6. java语言实现吃水果问题_Java 面向对象 之 人吃水果
  7. SAP学习笔记(SD的Delivery) 2008-12-28
  8. 母亲节板报图片计算机方案,母亲节电子手抄报图片大全
  9. 记录Flutter安装使用过程
  10. 王道数据结构课代表 - 考研数据结构 第三章 栈和队列 究极精华总结笔记