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

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

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

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

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

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. 【重点突破】—— Nodejs+Express+MongoDB的使用基础

    前言:最近学习vue和react的高阶项目,都需要和Nodejs+Express+MongoDB结合实现全栈开发.这里结合实例Demo和所学项目集中总结一下这部分服务端的基础知识. 一.Express ...

  2. 全民Scheme(1):数字游戏

    刚刚看到两句话,感觉不错,分享给大家: 1.用户的问题.就是我们的问题 2.做一些用户想要的东西 (define add1 (lambda (x) (+ 1 x))) (define sub1 (la ...

  3. Oracle基础 存储过程和事务

    一.事务和存储过程 在存储过程中如何使用事务.当需要在存储过程中同时执行多条添加.修改.删除SQL语句时,为了保证数据完整性,我们需要使用事务.使用方式和在PL-SQL中非常相似,但也有一些区别. - ...

  4. nginx静态文件缓存

    open_file_cache max=65535 inactive=30s; open_file_cache 打开缓存的同时也指定了缓存最大数目,以及缓存的时间 open_file_cache_va ...

  5. spring拦截器不拦截方法名原因

    开发一个基于注解的登录拦截器,遇到拦截器只能拦截controller不能拦截到具体的方法名,这样拦截器就完全没用,经过仔细摸索,DefaultAnnotationHandlerMapping和Anno ...

  6. SecureCRT如何调整好看的黄色

    1.常规 →默认会话→编辑默认编辑→白黑 字体为console 2.全局选项 ANSI颜色有一个 把黄色 拖过去即可

  7. android中依据不同分辨率dp和px的相互转算

    public class PxAndDp { /** * 依据手机的分辨率从 dp 的单位 转成为 px(像素) */ public static int dip2px(Context context ...

  8. shell脚本通过ping命令来获取平均延时

    #!/bin/bash #设置环境变量 PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin" exp ...

  9. 多trac的安装和配置

    其他相关网页: trac+svn: http://wenku.baidu.com/view/84389a81ec3a87c24028c43f.html apache(GCI):http://hi.ba ...

  10. HTTP协议断点续传

    using System;using System.Collections.Generic;using System.IO;using System.Linq;using System.Net;usi ...