又是一个阳光明媚的日子,小白看着刚刚从东边升起的太阳,感觉太阳爷爷也在向她打招呼,小白就不经的微笑起来!心想:今天又会学到什么有趣的东西呢?有些小期待,也有些小激动!

  小刘来得比小白还早,两辆相视而笑打了一下招呼!

  小刘:小白!你过来,让你思考一下这段代码是怎么个执行过程?就当拿来给你早上提提神,醒醒脑的吧?

  小刘:我要去早会!你把这个好好想想,等下我回来的时候告诉我!

  小白点点头,小白打量这段代码:

def f1():
return 'f1' def f2():
r = f1()
return r def f3():
r = f2()
return r
ren = f3()

  

  小白把这个画的花花绿绿的,小白点着头,嘴里念叨着有点意思

  小刘回来了,问她思考怎么样呢?

  小白回答到:ren变量的结果为‘f1’,解释时从上往下解释,遇定义函数不执行,只是刷到内存,执行f3上下跑了个来回

  小刘看了一下小白画的图,瞬间懂了,连忙夸奖小白:基础学的不错啊,没错就是你说的

  小刘:那我再给你看一个例子,看你能悟出来么?

def f4(a1,a2):
if a1 > 3:
return
print(a1)
a3 = a1 + a2
f4(a2,a3) r = f4(0,1)
print(r)

  小白看了看,又画了起来

  

  小白很快得出来答案,会打印0,1,1,2,3  函数返回默认值None

  小刘哈哈大笑:小白!你回去吧!不用我教,都会了,回去自悟吧

  小白笑了:笨人有笨法子,好时长,还需要你这位大神指点!

  小刘接连问道:那你知道这个算法叫什么吗?

  小白:好像叫递归,以前了解过一点

  小刘:那你知道它的优缺点和定义吗?

  小白摇摇头!

  小刘:小白记好了

     1.在过程或函数里调用自身

     2.递归算法解题简洁易读,但效率低

     3.在使用递归策略时,必须要有结束条件,而这个称为递归出口,最大递归深度为999层

  小白感叹道:小小的一个递归这么多的学问啊

  小刘:你还不知道你刚才你得出的那个数列叫做斐波那契数列吧?

  小白:还真不知道

  小刘:就是某个数等于前两项之和,我这边还有个设置递归深度的函数给你看看

def f5(depth,a1,a2):
if depth == 10:
return a1
a3 = a1 + a2
r = f5(depth+1,a2,a3)
return r
ret = f5(1,0,1)
print(ret)

   

  小刘:小白!这个弄明白了吧?

  小白点点头

  小刘:那我们接下来看一个更为复杂的例子,叫做二分法查找,用到原理就是递归原理

二分法查找

  二分法查找又叫对半查找,前提是对有序数列进行查找,拿要查找的数和处在数据源中间的那项进行比较,每比较一次就排除一半

#二分法查找
lis = list(range(2,11,4))
print(lis)
#[2, 6, 10] def semi_find(find_n,data_resources):
i = int(len(data_resources)/2) #求得中间项的索引位置
if len(data_resources) >= 1: #递归终止条件
if data_resources[i] > find_n: #要查找的数处在前半部分
semi_find(find_n,data_resources[:i]) #排除后半部分
elif data_resources[i] < find_n: #要查找的数处在后半部分
if find_n < data_resources[i + 1]: #因为int对小数是向下取整,这样会排除i到i+1索引位置对应数之间的值
print('没这数!') #一旦要查找的数判定处于上面范围,就是输出没有这数
return
else:
semi_find(find_n,data_resources[i:]) #排除前半部分
else:
print('%s in lis'%find_n) #如果等于中间数,就找到了
else:
print('没有你这个数!')
#加等号
semi_find(2,lis) #能找到2
semi_find(7,lis) #7,8,9超过最大递归层数也解决了 #不加等号
# semi_find(2,lis) #错误提示找不到2
# semi_find(7,lis) #能正确提示7,8,9不存在

欢迎大家对我的博客内容提出质疑和提问!谢谢

                                                                             笔者:拍省先生

  

python基础-第五篇-5.2递归的更多相关文章

  1. python基础-第五篇-5.4正则表达式

    正则基础知识 正则表达式是通过调用re模块实现的 在python里,正则表达式处理对象为字符串,所以正则里方法和字符串的方法有很多相似的地方:re.findall和find,re.split和spli ...

  2. python基础-第五篇-5.3装饰器

    小白发呆的看着窗外,同事们陆陆续续的地来到公司,想起算法,小白就飘飘然了.突然后面传来一声呼唤,原来是小刘! 小刘:不好意思啊!堵车了,就来晚了点,不耽误你的时间,咱们就开启的今天的培训内容吧! 小白 ...

  3. python基础-第五篇-5.1冒泡排序

    几个月过去了,小白逐渐对公司的后端服务熟悉了,不过这天小白又接到一封神秘邮件,是景女神发来的:公司急需一批对语言算法有些了解的优秀员工,鉴于你在公司的表现很不错,现在给到你一个培训机会,请速到开发部报 ...

  4. Python基础学习五

    Python基础学习五 迭代 for x in 变量: 其中变量可以是字符串.列表.字典.集合. 当迭代字典时,通过字典的内置函数value()可以迭代出值:通过字典的内置函数items()可以迭代出 ...

  5. python基础-第六篇-6.2模块

    python之强大,就是因为它其提供的模块全面,模块的知识点不仅多,而且零散---一个字!错综复杂 没办法,二八原则抓重点咯!只要抓住那些以后常用开发的方法就可以了,哪些是常用的?往下看--找答案~ ...

  6. Python 基础学习 总结篇

    Python 基础学习总结 先附上所有的章节: Python学习(一)安装.环境配置及IDE推荐 Python学习(二)Python 简介 Python学习(三)流程控制 Python学习(四)数据结 ...

  7. Python基础知识(五)------字典

    Python基础知识(四)------字典 字典 一丶什么是字典 ​ dict关键字 , 以 {} 表示, 以key:value形式保存数据 ,每个逗号分隔 ​ 键: 必须是可哈希,(不可变的数据类型 ...

  8. Python基础【第一篇】

     一.Python简介 Python的创始人(Guido von Rossum 荷兰人),Guido希望有一种语言既能像C一样方便地调用操作系统的功能接口,也能像shell脚本一样,轻松地实现编程,A ...

  9. python基础知识第一篇(认识Python)

    开发语言: 高级语言:python java php c++ 生成的字节码 字节码转换为机器码 计算机识别运行 低级语言:C 汇编 生成的机器码 PHP语言:适用于网页,局限性 Python,Java ...

随机推荐

  1. iOS11

    _tab.estimatedRowHeight = 0; if (@available(iOS 11.0, *)) { //当有heightForHeader delegate时设置 _tab.est ...

  2. linux系统预留内存和磁盘大小

    默认情况下, Linux 会最多使用 40% 的可用内存作为文件系统缓存.当超过这个阈值后,文件系统会把将缓存中的内存全部写入磁盘, 导致后续的 IO 请求都是同步的. 将缓存写入磁盘时,有一个默认1 ...

  3. SQL语句练习手册--第四篇

    一.变量那点事儿 1.1 局部变量 (1)声明局部变量 DECLARE @变量名 数据类型 ) DECLARE @id int (2)为变量赋值 SET @变量名 =值 --set用于普通的赋值 SE ...

  4. CDN原理实现详情

    CDN真是个好东西,但是究竟是怎么实现的呢, 学习下吧 首先浏览器发起请求 Dns解析寻找服务器资源 使用CDN加速的内容会被放到不同的服务器上 根据用户的请求来判断 -- 算了表达不清楚,看图吧! ...

  5. 【VBA】切换引用样式

    在Excle中有两种引用方式,例如:第一行第一列的单元格可以是:A1  也可以是R1C1 切换引用样式的代码如下: Sub 切换引用样式() Application.ReferenceStyle = ...

  6. oracle数据库权限管理

    权限管理: oracle 9里面默认的三个username和password: sys change_on_install //权限最高的管理员 system manager //普通的管理员 sco ...

  7. 1045. Favorite Color Stripe (30) -LCS同意元素反复

    题目例如以下: Eva is trying to make her own color stripe out of a given one. She would like to keep only h ...

  8. SpringCloud系列三:将微服务注册到Eureka Server上

    1. 回顾 通过上篇博客的讲解,我们知道硬编码提供者地址的方式有不少问题.要想解决这些问题,服务消费者需要一个强大的服务发现机制,服务消费者使用这种机制获取服务提供者的网络信息.不仅如此,即使服务提供 ...

  9. Hadoop 配置及hadoop HA 的配置

    注:本文中提到的ochadoop 不要感到奇怪,是亚信公司内部自己合成的一个包.把全部的组件都放在一个包内了.免去了组件的下载过程和解决兼容问题.事实上也能够自己下载的.不要受到影响. 另,转载请注明 ...

  10. swift中代理的使用

    1.首先定义一份协议. protocol HttpToolProrocol{ //1.代理方法,将server返回的字典传递给调用者 func didRecieveResults(result:NSD ...