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

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

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

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

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

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. Microsoft Sync Framework 2.1 可再发行程序包 Microsoft Sync Framework 1.0 SP1 - 中文(简体)

    Sync Framework 2.1 引入了新功能,这些功能支持您计算机上的 SQL Server 或 SQL Server Compact 数据库与 SQL Azure 数据库进行同步.此发行版还引 ...

  2. Haproxy 8种算法+Session共享

    Haproxy有8种负载均衡算法(balance),分别如下: 1.balance roundrobin # 轮询,软负载均衡基本都具备这种算法 2.balance static-rr # 根据权重, ...

  3. git学习——记录每次更新到仓库

    记录每次更新到仓库 工作目录下面的所有文件都不外乎这两种状态:已跟踪或未跟踪.已跟踪的文件是指本来就被纳入版本控制管理的文件,在上次快照中有它们的记录,工作一段时间后,它们的状态可能是未更新,已修改或 ...

  4. Python魔法师

    第一章:数据结构和算法 1.1 查找最大或者最小的n个元素 heapq 模块的两个函数 nlargest()  nsmallest() import heapq nums = [1, 8, 2, 23 ...

  5. Win10 导航窗口不能移动文件win10 资源管理器 无法拖动文件到左侧驱动器

    Win10 导航窗口不能移动文件怎么办 Win10左侧导航栏不能移动文件怎么办 win10 资源管理器 无法拖动文件到左侧驱动器怎么办 在同一个文件夹可以拖动来移动文件,拖到地址栏的面包屑也可以移动文 ...

  6. requestAnimationFrame 使用

    1.概述 参考网址:https://developer.mozilla.org/zh-CN/docs/Web/API/Window/requestAnimationFrame window.reque ...

  7. Android 热修复使用Gradle Plugin1.5改造Nuwa插件

    随着谷歌的Gradle插件版本号的不断升级,Gradle插件如今最新的已经到了2.1.0-beta1,相应的依赖为com.android.tools.build:gradle:2.0.0-beta6, ...

  8. 【Shell】建立一个脚本统计当前登录用户数

    who命令 who命令是显示目前登陆系统的用户信息,执行who命令可以得知目前哪些用户登入系统,单独执行who命令会列出登入账号,使用的终端机,登入的时间以及从何处登入或正在使用哪个显示器. 统计用户 ...

  9. 用Python实现邮件发送Hive明细数据

    代码地址如下:http://www.demodashi.com/demo/12673.html 一.需求描述 客户需要每周周一接收特定的活动数据,生成Excel或是CSV文件,并通过邮件发送给指定接收 ...

  10. 【翻译自mos文章】asm 归档路径满了

    asm 归档路径满了 參考原文: ASM Archive destination is full. (Doc ID 351547.1) 适用于: Oracle Server - Enterprise ...