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接收的只是键值对的参数 ...
随机推荐
- servlet的补充
1 request client获得请求. response 设置client响应2 text/html13123 不明确的响应用下载处理.3 MIME类型不明确在w3shool4 两种写utf-8的 ...
- css预处理器sass学习
SASS 叫做css预处理器,他的基本思想是用一门专门的编程语言来进行页面样式的设计,然后在编译成正常的css文件. Sass的用法 安装 sass是用ruby语言写的,所以我们在安装sass之前要先 ...
- C++(十五) — sizeof 运算符
1.基本数据类型 sizeof 是一个关键字,它是一个编译时运算符,用于判断变量或数据类型的字节大小. sizeof 运算符可用于获取类.结构.共用体和其他用户自定义数据类型的大小. 使用 sizeo ...
- jquery二维码生成插件jquery.qrcode.js
插件描述:jquery.qrcode.js 是一个能够在客户端生成矩阵二维码QRCode 的jquery插件 ,使用它可以很方便的在页面上生成二维条码. 转载于:http://www.jq22.com ...
- Ajax-03 XmlHttpRequest实现Ajax
概述 Ajax主要就是使用XmlHttpRequest对象来完成请求的操作,该对象在主流浏览器中均存在 XmlHttpRequest对象的主要方法 a. void open(String method ...
- JAVA定时任务Timer
故事起因 因业务需要,写了一个定时任务Timer,任务将在每天的凌晨2点执行,代码顺利码完,一切就绪,开始测试.运行程序,为了节省时间,将系统时间调整为第二天凌晨1点59分,看着秒针滴答滴答的转动,期 ...
- uva 10125 二分
https://vjudge.net/problem/UVA-10125 和之前做过的一道a+b+c=X的问题类似,不过这个要求多了a+b+c=d-->a+b=d-c 且abcd互不相等 我们 ...
- MVC,MVP 和 MVVM 的图示,区别
作者: 阮一峰 日期: 2015年2月 1日 复杂的软件必须有清晰合理的架构,否则无法开发和维护. MVC(Model-View-Controller)是最常见的软件架构之一,业界有着广泛应用.它本身 ...
- pdb 源码索引符号服务器创建过程
pdb是调试程序必不可少的东西,它保存着一个exe或dll的调试信息,对pdb进行源码索引可以快速找到软件对应该版本的代码,本文以subversion版本控制服务器进行介绍 一.需要安装的软件 win ...
- laravel支持的日志写入模式和日志严重程度级别:
四种日志写入模式: single:单一的 daily:日常的 syslog:系统记录 errorlog:错误日志 Monolog 识别以下严重程度的级别, 从低到高为: debug. info.not ...