这篇文章简单介绍了迭代和递归的概念、两者的区别

什么是迭代:

迭代是重复反馈过程的活动,其目的通常是为了接近并达到所需的目标或结果。每一次对过程的重复被称为一次“迭代”,而每一次迭代得到的结果会被用来作为下一次迭代的初始值。
在计算机科学中,迭代是程序中对一组指令(或一定步骤)的重复。

什么是递归:

递归在计算机科学中是指一种通过重复将问题分解为同类的子问题而解决问题的方法。

举个栗子:

我们经常讲的无聊故事《老和尚与小和尚》,就是一个递归

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

还有一个故事《被打死的狗》(这个名字是我自己起的),也是递归

一只狗来到厨房,偷走了一小块面包。厨子举起勺子,把那只狗打死了。于是所有狗都跑来了,给那只狗掘了一个坟墓,还刻了墓志铭,让未来的狗可以看到:“一只狗来到厨房,偷走了一小块面包。厨子举起勺子,把那只狗打死了。于是所有狗都跑来了,给那只狗掘了一个坟墓,还刻了墓志铭,让未来的狗可以看到......”

可见,学好了递归,不仅对编程有帮助,对将来的哄孩子也有帮助,一个故事就能递归到孩子睡着。

在使用递归时,必须要有一个明确的递归结束条件,不然函数会一直运行下去。

迭代和递归的应用上的区别:

迭代的工作过程

利用函数的原值推导出一个新的值

以求解1+2+3+4......+n为例,迭代是这样的:

0+1=1
1+2=3
3+3=6
6+4=10
10+5=15

形状是这样的:

**
**
**
**
**

递归的工作过程

把一个复杂的问题一步步拆分为一个稍微简单的问题,当获得最简单的情况后,再一步步返回,逐步得到复杂问题的解。

以求解1+2+3+4......+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

形状是这样的:

*
**
***
****
*****
****
***
**
*

迭代和递归,应该选哪个:

使用递归能够使代码更简洁明了,具有较好的可读性。但是递归需要系统堆栈,会消耗很多的系统资源。迭代具有更高的运行效率,系统资源占用少。

所以往往有这样的观点:能不用递归就不用递归,递归都可以用迭代来代替。

既然如此,那么递归是不是就没有存在的必要了。

不是这样的。

从理论上说,所有的递归函数都可以转换为迭代函数,反之亦然。但从算法结构来说,递归声明的结构并不总能够转换为迭代结构,原因在于结构的引申本身属于递归的概念,用迭代的方法在设计初期根本无法实现。因而可以从实际上说,所有的迭代可以转换为递归,但递归不一定可以转换为迭代。

采用递归算法需要的前提条件是,当且仅当一个存在预期的收敛时,才可采用递归算法,否则,就不能使用递归算法。

而迭代虽然效率高,运行时间只因循环次数增加而增加,没什么额外开销,空间上也没有什么增加,但缺点就是不容易理解,编写复杂问题时困难。

所以,究竟是用递归还是用迭代,要根据实际情况来选择。

因为本人水平十分有限,上述内容较多的借鉴了网络。感谢在互联网上无私奉献自己知识和经验的前辈!

python内置函数(2)-递归与迭代的更多相关文章

  1. 【学习笔记】--- 老男孩学Python,day15 python内置函数大全,递归,二分法

    1. lamda匿匿名函数2. sorted()3. filter()4. map()5. 递归函数 一. lamda 匿名函数 为了了解决一些简单的需求⽽设计的⼀句话函数 语法: 函数名 = lam ...

  2. Python基础(协程函数、内置函数、递归、模块和包)-day05

    写在前面 上课第五天,打卡: 凭着爱,再回首: 一.协程函数(生成器:yield的表达式形式) 1.yield 的语句形式: yield 1 - 这种方式在 Python基础(函数部分)-day04  ...

  3. Python内置函数和内置常量

    Python内置函数 1.abs(x) 返回一个数的绝对值.实参可以是整数或浮点数.如果实参是一个复数,返回它的模. 2.all(iterable) 如果 iterable 的所有元素为真(或迭代器为 ...

  4. python内置函数

    python内置函数 官方文档:点击 在这里我只列举一些常见的内置函数用法 1.abs()[求数字的绝对值] >>> abs(-13) 13 2.all() 判断所有集合元素都为真的 ...

  5. python 内置函数和函数装饰器

    python内置函数 1.数学相关 abs(x) 取x绝对值 divmode(x,y) 取x除以y的商和余数,常用做分页,返回商和余数组成一个元组 pow(x,y[,z]) 取x的y次方 ,等同于x ...

  6. Python基础篇【第2篇】: Python内置函数(一)

    Python内置函数 lambda lambda表达式相当于函数体为单个return语句的普通函数的匿名函数.请注意,lambda语法并没有使用return关键字.开发者可以在任何可以使用函数引用的位 ...

  7. [python基础知识]python内置函数map/reduce/filter

    python内置函数map/reduce/filter 这三个函数用的顺手了,很cool. filter()函数:filter函数相当于过滤,调用一个bool_func(只返回bool类型数据的方法) ...

  8. 那些年,很多人没看懂的Python内置函数

    Python之所以特别的简单就是因为有很多的内置函数是在你的程序"运行之前"就已经帮你运行好了,所以,可以用这个的特性简化很多的步骤.这也是让Python语言变得特别的简单的原因之 ...

  9. Python 内置函数笔记

    其中有几个方法没怎么用过, 所以没整理到 Python内置函数 abs(a) 返回a的绝对值.该参数可以是整数或浮点数.如果参数是一个复数,则返回其大小 all(a) 如果元组.列表里面的所有元素都非 ...

  10. 【转】python 内置函数总结(大部分)

    [转]python 内置函数总结(大部分) python 内置函数大讲堂 python全栈开发,内置函数 1. 内置函数 python的内置函数截止到python版本3.6.2,现在python一共为 ...

随机推荐

  1. 一张图讲解为什么需要自己搭建自己的git服务以及搭建的途径

    图片信息量有点大.不废话上图 图中的一些链接: gitlab官方安装文档 https://github.com/gitlabhq/gitlabhq/blob/master/doc/install/in ...

  2. 运用 BoxLayout 进行 Swing 控件布局

    摘自http://www.cnblogs.com/fnlingnzb-learner/p/6008572.html 运用 BoxLayout 进行 Swing 控件布局 对于初学 Java Swing ...

  3. 自定义View的编写

    在项目的时候,很多情况要用到自定义View来达到自己想要的效果,所有自定义View的编写很重要. 首先看看所要实现的效果: 最上面的一行字“LogicView”每次从左向右滚动,下面的圆从角度0到36 ...

  4. UGUI Image控件

    今天一起学习Image控件O(∩_∩)O~ 介绍一下基本的属性 Source:Image:               指定图片源, 图片设置2DSprite(2D and UI)格式Color:   ...

  5. kettle工具同步数据乱码-Linux下乱码问题二

    将写好的kettle工程部署到Linux下后,同步的数据都成了乱码,幸运的是数据库有备份. 下面就说一下,kettle工程如何同步两端编码格式都是utf8的数据库. 我们只需要更改kettle数据库连 ...

  6. CodePen's CSS

    p{text-indent:2em;}前端开发whqet,csdn,王海庆,whqet,前端开发专家 翻译自:CodePen's CSS 翻译人员:前端开发whqet,意译为主.不当之处欢迎大家指正. ...

  7. Oracle SQL函数之日期函数

    sysdate [功能]:返回当前日期. [参数]:没有参数,没有括号 [返回]:日期 SQL> SELECT SYSDATE FROM DUAL; SYSDATE ----------- // ...

  8. RMAN备份各种物理文件

    RMAN运行脚本的方式:RMAN TARGET / @backup_db.rmanRMAN TARGET / cmdfile=backup_db.rman在RMAN中执行操作系统中保存的脚本:RMAN ...

  9. 【二分答案】 【POJ3497】 【Northwestern Europe 2007】 Assemble 组装电脑

    Assemble Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 3171   Accepted: 1013 Descript ...

  10. Using platform encoding (UTF-8 actually) to copy filtered resources, i.e. build is platform dependent

    修改pom.xml文件,添加以下属性 <project> ... <properties> <project.build.sourceEncoding>UTF-8& ...