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

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

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

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

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

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. Spring中如何配置事务

    学过SSH的都知道,整合了SSH之后,SSH的经典增删改查案例业务逻辑层的代码就十分简单.基本上都是一句话的事. public void addUser(Webuserlogin user) { // ...

  2. python——iterator迭代器|iterator详解——20140918|

    -----------------------------------------------------------------------------前言--------------------- ...

  3. 【VAB】获取库文件地址

    如何获取Excle库文件地址呢?具体代码如下: Public Sub 获取Excel库文件夹的路径() MsgBox "库文件夹的路径是: " & Application. ...

  4. Servlet基本用法二接口和类

    转自:http://www.cnblogs.com/xujian2014/p/4536168.html 一.摘要 本文主要简单介绍开发Servlet需要用到的接口和类. 二.ServletReques ...

  5. 使用 mybatis + flying-0.9.4 的电商后端

    代码地址如下:http://www.demodashi.com/demo/12779.html mybatis.flying - 阳春 (Sunny-Spring) 项目介绍请见 flying-doc ...

  6. Windows下UEFI环境的搭建

    Windows下UEFI环境的搭建 一.环境准备 1. 安装2012及以上VS https://visualstudio.microsoft.com/ 2.下载NASM 2.13.03  http:/ ...

  7. Httpclient 实现带参文件上传

    这里直接贴出的是我封装好的doPostFile方法,httpclient 的版本是3.1. public static String doPostFile(String url, Part[] par ...

  8. POJ 3252 Round Numbers 数学题解

    Description The cows, as you know, have no fingers or thumbs and thus are unable to play Scissors, P ...

  9. gulp配置,实例演示

    项目完成后的目录 我们所需要的插件为:gulp-minify-css gulp-concat gulp-uglify gulp-rename del 如下图所示,完成后的项目目录结构: 附加,获取pa ...

  10. Redis的订阅发布

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using ServiceS ...