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

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

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

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

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

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. 自动播放——幻灯片缓冲效果&&带Loading效果的图片切换&&移动效果(按轨迹移动)

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

  2. close_wait状态的产生原因及解决(转)

    最近测试环境server由于需要与大量的后台server交互,今天突然发现有大量的close_wait产生,于是仔细研究了一下: 如果我们的服务器程序处于CLOSE_WAIT状态的话,说明套接字是被动 ...

  3. Calculation 2-欧拉函数的运用

    Calculation 2 Time Limit: 1000MS   Memory Limit: 32768KB   64bit IO Format: %I64d & %I64u Submit ...

  4. c#实现记事本

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  5. Javascript属性constructor/prototype的底层原理

    在Javascript语言中,constructor属性是专门为function而设计的,它存在于每个function的prototype属性中. 这个constructor保存了指向function ...

  6. 利用$(window).resize()实现窗口大小自适应宽度问题

    © 版权声明:本文为博主原创文章,转载请注明出处 问题描述:利用iframe做页面引入,用$(window).resize()作自适应:结果窗口变小时,利用$(window).width()获取到的宽 ...

  7. linux下拷贝隐藏文件

    1.拷贝隐藏文件 把/home/u文件夹中的全部文件(包含隐藏文件)拷贝到/home/user1中  cp   -a   /home/u/.    /home/user1 2.改动主机名: vi /e ...

  8. Trie|如何用字典树实现搜索引擎的关键词提示功能

    Trie字典树 Trie字典树又称前缀树,顾名思义,是查询前缀匹配的一种树形数据结构 可以分为插入(创建) 和 查询两部分.参考地址极客时间 下图为插入字符串的过程: 创建完成后,每个字符串最后一个字 ...

  9. java多线程之happens-before

    1.背景问题 在讲happens-before之前,先引入一个例子: 假定我们有已经被初始化的变量: int counter = 0; 这个 counter 变量被两个线程所共有,也就是说线程A和线程 ...

  10. C#趣味程序---理財高手

    问题:如果银行存款分五种 利率:0.63%  一年   月 利率:0.66%  二年   月 利率:0.69%  三年   月 利率:0.75%  五年   月 利率:0.84%  八年   月 如今 ...