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

什么是迭代:

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

什么是递归:

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

举个栗子:

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

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

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

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

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

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

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

迭代的工作过程

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

以求解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. python刷取CSDN博文访问量之一

    python刷取CSDN博文访问量之一 作者:vpoet 注:这个系列我只贴代码,代码不注释.有兴趣的自己读读就懂了,纯属娱乐,望管理员抬手 若有转载一定不要注明来源   #coding=utf-8 ...

  2. 对Linux 新手非常有用的20 个命令

    你打算从Windows换到Linux上来,还是你刚好换到Linux上来?哎哟!!!我说什么呢,是什么原因你就出现在我的世界里了.从我以往的经验来说,当我刚使用Linux,命令,终端啊什么的,吓了我一跳 ...

  3. IOS Xmpp的Iq发送和解析之请求讨论组成员

    #pragma mark - 获取讨论组成员 - (void)getDiscussionMemberInfoWithSendIq:(discussionModel *)data { NSXMLElem ...

  4. 有关docker新版的icc、iptables的一个巨坑

    之前玩过docker的icc=false.iptables=true 按照这两个参数配置之后,想指定两个特定的容器通讯,直接用--link即可. 但最近我在下载了1.12新版的docker,这个不奏效 ...

  5. 那些 Cynthia 教我的事 之 PMSec (三)

    在项目中,聪明的Jenny童鞋提了一个suggestion,即将同一个店同一人提交的请求,经过上级批准之后,邮件内容需要合并. 非常滴合理有木有~~ 提交十个申请,将收到十封邮件,的确不友好哦.可是由 ...

  6. java学习之部分笔记2

    1.变量 实例变量和局部变量 实例变量系统会自动初始化为0和null(string),局部变量必须设定初始值. 静态方法里只能引用静态变量 数据类型的自动转换! int—>long 2.构造方法 ...

  7. JQ动画 show hide

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  8. hdu2429Ping pong

    Problem Description N(3<=N<=20000) ping pong players live along a west-east street(consider th ...

  9. Submission Details

    You are climbing a stair case. It takes n steps to reach to the top. Each time you can either climb ...

  10. volatile 和const 变量的使用

    一.volatile定义: 一个定义为volatile的变量是说这变量可能会被意想不到的被改变,这样,有了volatile变量后,就提醒编译器就不会去假设这个变量的值了.精确地说就是,编译中的优化器在 ...