python开发函数进阶:递归函数
一,什么叫递归
#递归
#在一个函数里调用自己
#python递归最大层数限制 997
#最大层数限制是python默认的,可以做修改
#但是我们不建议你修改
例子和尚讲故事
#!/usr/bin/env python
#_*_coding:utf-8_*_ #:基础版本
def story():
print("从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呀?")
while True:
story() #:递归版本
def story():
#递归函数,在一个函数内调用自己
#最大递归层数做了一个限制:997
print("从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呀?")
story()
print('')
story()
修改深度
#!/usr/bin/env python
#_*_coding:utf-8_*_ import sys #所有和python相关的设置和方法
sys.setrecursionlimit(10000000)
n = 0
def f():
global n
n += 1
print(n)
f()
f()
二,递归实例
递归实现三级菜单
#!/usr/bin/env python
#_*_coding:utf-8_*_ #三级菜单,按B返回
menu = {
'北京': {
'海淀': {
'五道口': {
'soho': {},
'网易': {},
'google': {}
},
'中关村': {
'爱奇艺': {},
'汽车之家': {},
'youku': {},
},
'上地': {
'百度': {},
},
},
'昌平': {
'沙河': {
'老男孩': {},
'北航': {},
},
'天通苑': {},
'回龙观': {},
},
'朝阳': {},
'东城': {},
},
'上海': {
'闵行': {
"人民广场": {
'炸鸡店': {}
}
},
'闸北': {
'火车战': {
'携程': {}
}
},
'浦东': {},
},
'山东': {},
}
print('主菜单'.center(40,'='))
# while True:
# for i in menu:print(i)
# user1 = input('no 1>>>:')
# if user1 == 'b':break
# if user1 == 'q':exit()
# if user1 not in menu:continue
# if user1 in menu:
# while True:
# for i1 in menu[user1]: print(i1)
# user2 = input('no 2>>>:')
# if user2 == 'b': break
# if user2 == 'q': exit()
# if user2 not in menu[user1]: continue
# if user2 in menu[user1]:
# while True:
# for i2 in menu[user1][user2]: print(i2)
# user3 = input('no 3>>>:')
# if user3 == 'b': break
# if user3 == 'q': exit()
# if user3 not in menu[user1][user2]: continue
# if user3 in menu[user1][user2]:
# while True:
# user4 = input('no 4>>>:')
# if user4 == 'b':break
# if user4 == 'q':exit() def list(menu): #menu being
while True:
for i in menu:
print(i)
k = input('>>>').strip()##beijng
if k == 'b' or k =='q': #k
return k #diyi beijing
if k in menu:
ret = list(menu[k]) #menu shahe
if ret == 'q':return 'q'
index = list(menu)
print(index)
递归实现二分查找
#!/usr/bin/env python
#_*_coding:utf-8_*_ #二分查找算法
#算法:计算的方法
#有序的递增列表
#查找的是数字
l = [2,3,5,10,15,16,18,22,26]
def find(l,aim): #l:列表 aim:要找的
mid = len(l)//2 #计算中点
if l[mid] > aim: #判断中间位置的值和目标值的大小关系
new_l = l[:mid] #[16,18] = [16,18,22,26][:mid]
return find(new_l,aim)
elif l[mid] < aim:#判断中间位置的值和目标值的大小关系
new_l = l[mid+1:]
return find(new_l,aim)
else:
return l[mid]
print(find(l,16)) #升级版二分法
#查找的是索引
l = [2,3,5,10,15,16,18,22,26]
def find2(l,aim,start,end):#[2,3,5,10,15,16,18,22,26] 0,8
mid = (end+start)//2 #4 #5+8/2=6 #start =5 end = 5 mid = 5
if start < end:
if l[mid] > aim: #15 17 #18 17
end = mid -1 #end =6-1 = 5
return find2(l,aim,start,end)
elif l[mid] < aim: #15 17
start = mid + 1 # start = 5
return find2(l, aim, start, end)
else:
return mid
else:
return "找不到"
print(find2(l,18,start=0,end = len(l)-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]
def func(l, aim,start = 0,end = len(l)-1 ):
mid = (start+end)//2
print(l[start:end+1])
if not l[start:end+1]: #空就是False not 就是 true
return
elif aim > l[mid]:
return func(l,aim,mid+1,end)
elif aim < l[mid]:
return func(l,aim,start,mid-1)
elif aim == l[mid]:
print("bingo")
return mid
index = func(l,1)
三,总结
#递归解决的问题
#就是通过参数,来控制每一次调用缩小计算的规模
#适合的场景
#数据的规模在减小,但是解决问题的思路没有改变
#结束递归的标志:return
python开发函数进阶:递归函数的更多相关文章
- python开发函数进阶:生成器表达式&各种推导式
一,生成器表达式 #生成器表达式比列表解析更省内存,因为惰性运算 #!/usr/bin/env python #_*_coding:utf-8_*_ new_2 = (i*i for i in ran ...
- python开发函数进阶:装饰器
一,装饰器本质 闭包函数 功能:就是在不改变原函数调用方式的情况下,在这个函数前后加上扩展功能 作用:解耦,尽量的让代码分离,小功能之前的分离. 解耦目的,提高代码的重用性 二,设计模式 开放封闭原则 ...
- python开发函数进阶:匿名函数
一,匿名函数 #简单的需要用函数去解决的问题 匿名函数的函数体 只有一行#也叫lambda表达式# cal2(函数名) = lambda n(参数) : n*n(参数怎么处理,并且返回值)#参数可以有 ...
- python开发函数进阶:可迭代的&迭代器&生成器
一,可迭代的&可迭代对象 1.一个一个的取值就是可迭代的 iterable#str list tuple set dict#可迭代的 ——对应的标志 __iter__ 2.判断一个变量是不 ...
- python开发函数进阶:内置函数
一,内置函数 #内置的模块#拿过来直接就用的:内置的函数 #!/usr/bin/env python #_*_coding:utf-8_*_ #内置的模块 #拿过来直接就用的:内置的函数 #作用域相关 ...
- python开发函数进阶:命名空间,作用域,函数的本质,闭包,作用域方法(globales)
一,命名空间 #局部命名空间#全局命名空间#内置命名空间 #三者的顺序#加载顺序 内置命名空间(程序运行前加载)->全局命名空间(程序运行中:从上到下加载)->局部命名空间(程 ...
- 【转】Python之函数进阶
[转]Python之函数进阶 本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函 ...
- Python之函数进阶
本节内容 上一篇中介绍了Python中函数的定义.函数的调用.函数的参数以及变量的作用域等内容,现在来说下函数的一些高级特性: 递归函数 嵌套函数与闭包 匿名函数 高阶函数 内置函数 总结 一.递归函 ...
- 《Python》 函数进阶和名称空间作用域
函数进阶: 一.动态参数:*args **kwargs *args是元祖形式,接收除去键值对以外的所有参数 # args可以换成任意变量名,约定俗成用args **kwargs接收的只是键值对的参数 ...
随机推荐
- 解决Python字符串处理出现错误UnicodeDecodeError: ‘ascii’ codec can’t decode byte 0xe4 in position 108: ordinal not in range(128)
今天做课程设计遇到了和数据库交互的地方,sqlite数据库设置成utf-8格式编码,插入到数据库中是正确的,但是当读取出来的时候就会出错,原因就是Python的str默认是ascii编码,搜集网上的资 ...
- 案例学习:留言本制作V1、V2
需求V1: 请设计一个留言本功能的程序,包括普通用户发布和查看留言,管理员登录.查看和删除留言. 实验指导内容详见留言本制作(1) 需求V2: 1.请修改留言本程序的功能,添加普通用户添加登录功能,用 ...
- hdu 5973 Game of Taking Stones(大数,bash game¥)
Game of Taking Stones Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Ot ...
- STL标准容器特征
一. vector vector类是一种顺序容器,可以看作动态数组,容器中的元素存放在连续存储区域. vector容器自动分配.释放.扩展.收缩存储空间,不需要使用new或delete关键字. vec ...
- iOS-免证书真机调试
使用方法: 1.新建一个普通的项目 2.进入xcode,菜单栏选择xcode –> preferences (快捷键 command + ,) 3.在Accounts选项卡添加自己的Apple ...
- DOS命令说明
(转自:http://blog.csdn.net/mydriverc/article/details/2047152) 1 errorlevel dir cd md rd del ren cls ty ...
- Codeforces Round #394 (Div. 2) E. Dasha and Puzzle
E. Dasha and Puzzle time limit per test:2 seconds memory limit per test:256 megabytes input:standard ...
- 【CSAPP】三、程序的机器级表示
本章基于两种相关的机器语言:Intel IA32和x86-64,前者注重32位,后者注重64位. 本章脉络:c\汇编\机器码之间的关系,数据的表示,控制结构如何实现.运行栈,局部变量的存储,数据结构. ...
- 利用 localStorage 储存css js
链接 版本号, 可以后台输出到jsp页面上 移动端webapp值得一试: 兼容性好 网速慢,LS读取+eval大多数情况下快于304 webapp不需要seo,css也可以缓存,再通过js加载 浏览 ...
- 专业工具软件AutoCAD复习资料
专业工具软件AutoCAD复习资料 下载地址:http://download.csdn.net/detail/zhangrelay/9849503 这里给出了一些dwg格式的CAD资料,用于课后学习和 ...