初识递归


递归的定义——在一个函数里再调用这个函数本身


现在我们已经大概知道刚刚讲的story函数做了什么,就是在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归


刚刚我们就已经写了一个最简单的递归函数。


递归的最大深度——997


正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去。但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,于是python为了杜绝此类现象,强制的将递归层数控制在了997(只要997!你买不了吃亏,买不了上当...).


拿什么来证明这个“997理论”呢?这里我们可以做一个实验:

#初识递归
# def story():
# print('gushide neirongshi ')
# story()
# story()
#
#多大了alex,我不告诉你,alex比egon大两岁 44+2
#egon多大了,我不告诉你,egon比wusir大两岁 42+2
#wusir多大了,我不告诉你,wusir比金鑫大两岁 40+2
#金鑫40了
 def age(n):
# if n==4:
# return 40
# return age(n+1)+2
# print(age(1))
# #以下是拆解的分析过程
# def age(4):
# if 4==4:
# return 40
# # return age(3+1)+2 n=4 这一步不执行
# def age(3):
# if 3==4: #3!=4这一步不执行
# return 40
# return age(3+1)+2 #根据age4的到age3的内容 age(3)=40+2=42
# def age(2):
# if 2==4: #2!=4这一步不执行
# return 40
# return age(2+1)+2#根据age3的到age2的内容 age(2)=42+2=44
# def age(1):
# if 1==4: #1!=4这一步不执行
# return 40
# return age(1+1)+2#根据age2的到age1的内容 age(1)=44+2
#最后也是开始调用了age(1)想得到到他得结果,print(age(1))
#

二分找法
l = [2,3,5,10,15,16,18,22,26,30,32,35,41,42,43,55,56,66,67,69,72,76,82,83,88]
#print(l.index(66))#最传统的放法
#初级递归
# 但是1不能显示他的索引位,
#
# def func(l,n):
# mid=len(l)//2
# if l:
# if l[mid]>n:
# new_l=l[:mid]
# func(new_l,n)
# elif l[mid]<n:
# new_l=l[mid+1:]
# func(new_l,n)
# elif l[mid]==n:
# print(n,mid)
# else:
# print('数字不在内部')
# func(l,68)

二分找法


def func(l,n,start=0,end=None):#第一个问题,传参,这样传参数,就不会对函数进行切割,
if end==None:#而是去下标范围内的数值,l 不变
end=len(l)-1
if start < end: #当函数不存在时会出现func(l,n,mid+1,end)中的mid+1>end
mid=(start+end)//2# 因为取到所有的值了,此时end=0
if l[mid]>n:
func(l,n,start,mid)#这个是取的区间,而为改变列表
elif l[mid]<n:
func(l,n,mid+1,end)
elif l[mid]==n:
print(n,mid)
else:
print('数字不在内部')
func(l,67,start=0,end=None)

二分查找终极版



三级菜单
menu = {
'北京': {
'海淀': {
'五道口': {
'soho': {},
'网易': {},
'google': {}
},
'中关村': {
'爱奇艺': {},
'汽车之家': {},
'youku': {},
},
'上地': {
'百度': {},
},
},
'昌平': {
'沙河': {
'老男孩': {},
'北航': {},
},
'天通苑': {},
'回龙观': {},
},
'朝阳': {},
'东城': {},
},
'上海': {
'闵行': {
"人民广场": {
'炸鸡店': {}
}
},
'闸北': {
'火车战': {
'携程': {}
}
},
'浦东': {},
},
'山东': {},
}
def o_menu(menu):
while True:
for key in menu:
print(key)
select=input('选择')
if select=="q":
return 'q'
if select=='b':
return 'b'
if select in menu and menu[select]: 这句话的意思是满足select在menu中,而且 下一级为字典,不是空的情况
borq= o_menu(menu[select])#这儿跟send有点像,执行到这儿return o_menu(menu[select])
if borq=='q': #但是当能够执行下去的话,在下一次循环中我输入了b 就会把b return给
return 'q'#上一次调用的函数就是 o_menu(menu[select]) 然后就borq =="b"了什么也不做
o_menu(menu) #当等于'q"时,就会返回给上次的函数,直到跳出

三级菜单

												

day16 python学习 递归的更多相关文章

  1. python学习7—函数定义、参数、递归、作用域、匿名函数以及函数式编程

    python学习7—函数定义.参数.递归.作用域.匿名函数以及函数式编程 1. 函数定义 def test(x) # discription y = 2 * x return y 返回一个值,则返回原 ...

  2. python学习三十五天函数递归的用法

    python函数递归就是自己调用自己,无限循环,但是python限制了调用的次数1000次,就会终止,递归用在栏目分类,采集程序比较多,下面简单说函数递归用法和实例 1,函数递归用法 def func ...

  3. python学习之旅

    python学习分类 python基础    +- day01——python初始.变量.常量.注释.基础数据类型.输入.if day02——while.字符串格式化.运算符.编码初识 day03—— ...

  4. Python 学习小结

    python 学习小结 python 简明教程 1.python 文件 #!/etc/bin/python #coding=utf-8 2.main()函数 if __name__ == '__mai ...

  5. Python学习记录day6

    title: Python学习记录day6 tags: python author: Chinge Yang date: 2016-12-03 --- Python学习记录day6 @(学习)[pyt ...

  6. Python学习记录day5

    title: Python学习记录day5 tags: python author: Chinge Yang date: 2016-11-26 --- 1.多层装饰器 多层装饰器的原理是,装饰器装饰函 ...

  7. python学习心得第五章

    python学习心得第五章 1.冒泡排序: 冒泡是一种基础的算法,通过这算法可以将一堆值进行有效的排列,可以是从大到小,可以从小到大,条件是任意给出的. 冒泡的原理: 将需要比较的数(n个)有序的两个 ...

  8. python学习笔记之module && package

    个人总结: import module,module就是文件名,导入那个python文件 import package,package就是一个文件夹,导入的文件夹下有一个__init__.py的文件, ...

  9. python学习笔记(六)文件夹遍历,异常处理

    python学习笔记(六) 文件夹遍历 1.递归遍历 import os allfile = [] def dirList(path): filelist = os.listdir(path) for ...

随机推荐

  1. Confluence 6 配置 LDAP 连接池

    当 LDAP 连接池被启用后,LDAP 目录服务器将会维护一个连接池同时当必要的时候指派他们.当一个连接关闭后,这个连接将会放回到连接池中供以后进行使用.这种设置将会有效的提高系统性能. 希望配置 L ...

  2. Spring+Mybatis+Dubbo报错java.lang.reflect.MalformedParameterizedTypeException

    原因是spring的jar文件冲突,排除spring的文件即可 <dependency> <groupId>com.alibaba</groupId> <ar ...

  3. Axel and Marston in Bitland CodeForces - 782F (bitset优化)

    题目链接 $dp[0/1][i][x][y]$表示起始边为0/1, 走$2^i$ 步, 是否能从$x$走到$y$ 则有转移方程 $dp[z][i][x][y]\mid=dp[z][i-1][x][k] ...

  4. 使用python创建mxnet操作符(网络层)

    对cuda了解不多,所以使用python创建新的操作层是个不错的选择,当然这个性能不如cuda编写的代码. 在MXNET源码的example/numpy-ops/下有官方提供的使用python编写新操 ...

  5. python-day7-数字类型的内置方法

    #=====>part1:数字类型#掌握:int,float#了解:Long(在python2中才有),complex# num=10# num=int(10)# print(type(num) ...

  6. python-day17--列表推导式,生成器表达式

    # for i in range(100):# print(i*i) 列表推导式: # l =[i*i for i in range(100)]# print(l) # l = [{'name':'v ...

  7. ssh: connect to host 192.168.11.180 port 22: Connection refused

    错误原因: 1.sshd 未安装:sudo apt-get install openssh-server 2.sshd 未启动:sudo net start sshd 3.防火墙:sudo ufw d ...

  8. Python的数据类型2列表

    Python的数值类型List,也就是列表 Python的列表比较类似与其他语言的数组概念,但他又与其他语言数组的概念有很大的不同 C语言.Java的数组定义是这样的,存储多个同类型的数值的集合就叫数 ...

  9. 4.写出完整版的strcpy函数

    (1) 2~4分 void strcpy(char *strDest, char *strSrc) { while((*strDest++ = *strSrc++)!='\0'); } //将源字符串 ...

  10. struts2返回json字符串

    参考链接:http://www.cnblogs.com/starsli/p/4733669.html 1.通过使用struts2-json-plugin 插件来实现 2.通过收到使用json-lib提 ...