Day 13 : 函数递归,
从前有有座山,山里有座庙,庙里有个老和尚给小和尚们讲故事,讲的什么呀,讲的是,从前有有座山,山里有座庙,庙里有个老和尚给小和尚们讲故事,讲的什么呀?讲的是?......
递归:1、一个函数再内部调用了自己,这种写法就叫递归( recursion)。
2、递归额层数 在pytohn 里是有限制
3、写递归函数必须要有一个结束条件
例1:求阶乘 n= 7 7*6*5*4*3*2*1
def func(n):
if n == 1:
return 1
return n*func(n-1) print(func(4)) #分解步骤
n = 4
def func(4):#4*6 = 24 func(3)*4
if 4 == 1:
return 1
return 4*func(3)#当N=4时,if 条件不成立,先执行了func(3)然后进入下一步了递的过程
n = 3
def func(3):
if 4 == 1:
return 1
return 3*func(2)#当N=3时,if 条件不成立,先执行了func(2)然后进入下一步了以此类推
#下面说了。fun(2) =2 又到上一部 3*2=6
n = 2
def func(2):
if 2 == 1:
return 1
return 2*func(1) #2*1 =2 又回归到上一步
n = 1
def func(1):
if 1 == 1:
return 1#当N=1时,妇fun(1) =1 又执行回归的过程
例2 用递归函数,找索引 lis = [2,3,4,6,7,9,12,16,19,21,25,35,43,57,66,84,88,92,94,99]
# lis = [2,3,4,6,7,9,12,16,19,21,25,35,43,57,66,84,88,92,94,99]
#print(lis.index(57))13
# index = 0
# for i in lis:
# if i == 57:
# print(index)
# index += 1
#这种找法太慢,如果序列有100W个数字呢?
#所有使用2分算法 每次把列表分成一半来找
#思路1
# def search(num,lis):
# #先找中间的数字
# mid = len(lis)//2 #整除
# if lis[mid] > num :#如果中间的值大于要找的值
# lis = lis[0:mid]#那就从前面找值
# search(num,lis)#再去前面值得中间值因为lis已经改变
# elif lis[mid] <num :#如果中间的值小于要找的值
# lis = lis[mid+1:]#从后面找
# search(num,lis)#去后面值得中间值因为lis已经改变
# elif lis[mid] == num:
# return lis[mid]
#这个程序是错误的,因为你找的时候列表变小了。不是原来的列表了
#思路2
#你不能改变列表,你要改变索引的位置
lis = [2,3,4,6,7,9,12,16,19,21,25,35,43,57,66,84,88,92,94,99]
def search(num,lis,start = None,end=None):
start = start if start else 0#如果start没值使用0,有值使用传的值
end = end if end else len(lis)-1#如果end没值就计算,有值使用传的值
#先找中间的数字
mid = (end - start)//2 + start
#mid = (end-start) //2 这样不对,如果索引缩小后,值就不正确必须加前面的数字
if lis[mid] > num :#如果中间的值大于要找的值从左开始,
return search(num,lis,start,mid-1)#修改索引的位置从做开始从中间-1结束
elif lis[mid] < num :#如果中间的值小于要找的值从右开始,
return search(num,lis,mid+1,end)#中间开始,最后结束
elif lis[mid] == num:
return mid,lis[mid]
print(search(57,lis))
#此函数只有递的过程没有归的过程
递归
例3 三级菜单实例
#三级菜单
menu = {'北京':{
'海淀':{
'永定路':{},
'香山街':{}
},
'朝阳区':{
'小红门':{},
'太阳宫':{},
'潘家园':{}
}
}
,'陕西':{
'西安':{
'临潼区':{
'兵马俑':{}
},
'碑林区':{
'大雁塔':{}
}
},
'宝鸡':{
'凤翔县':{
'长青镇':{}
},
'岐山县':{
'某某镇':{}
}
}
}
,'甘肃':{'兰州':{
'安宁区':{
'黄河':{}
},
'城关区':{
'乌金峡':{}
}
},
'天水':{
'秦州区':{
'县家路':{}
},
'麦积区':{
'麦积山':{}
}
} }}
def Three_Level_Menu(menu):
while True:#如果输入的菜单不存在,就让用户一直输入。
for name in menu:print(name)#显示第一级菜单
key = input('请输入名称,如果退出请输入‘Q/q,如果返回上一层请输入B/b',)
if key.lower() == 'b':break#只跳出了当前函数的循环,
elif key.lower() == 'q':#和 ret相互结合,直接退出整个函数()
return 'q'
elif key in menu:
# for key1 in menu[key]:print(key1)# 打印2级菜单
# key2 = input('请输入名称')
#有没有发现上面2行代码,和函数定义的第一行和第二行基本差不多一样?
#相同的数据类型嵌套在一起,是不是感觉可以用递归呢?是不是感觉进入一个轮回?
#那我们继续调用这个函数即可
ret = Three_Level_Menu(menu[key])#不能继续传入menu了,不然和原来的菜单一样了
if ret == 'q': return 'q'
Three_Level_Menu(menu)
三级菜单
Day 13 : 函数递归,的更多相关文章
- python 之 函数 面向过程 三元表达式 函数递归
5.11 面向过程编程思想 核心是'过程'二字,过程即解决问题的步骤,即先干什么,再干什么........ 基于面向过程编写程序就好比在设计一条流水线,是一种机械式的思维方式. 总结优缺点: 优点:复 ...
- Learning-Python【14】:匿名函数与函数递归
一.什么是匿名函数 匿名函数就是没有名字的函数,又叫lambda表达式.用于一些简单的需要用函数去解决的问题,特点是只能在定义时使用一次,且函数体只有一行 匿名函数的定义就相当于只产生一个变量的值,而 ...
- Python之路Python全局变量与局部变量、函数多层嵌套、函数递归
Python之路Python全局变量与局部变量.函数多层嵌套.函数递归 一.局部变量与全局变量 1.在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量.全局变量作用域是整个程序,局 ...
- python基础-函数递归
函数递归 概念:直接或间接地重复调用函数本身,是一种函数嵌套调用的表现形式. 直接调用:在函数内部,直接调用函数本身 def foo(): print("这是foo函数") foo ...
- python函数:匿名函数、函数递归与二分法、面向过程编程
今天主要讲三大部分内容: 一.匿名函数二.函数递归与二分法三.面向过程编程 一.匿名函数: """ 1. 什么时匿名函数 def定义的是有名函数:特点是可以通过名字重复调 ...
- python基础-基础知识(包括:函数递归等知识)
老男孩 Python 基础知识练习(三) 1.列举布尔值为 False 的值空,None,0, False, ", [], {}, () 2.写函数:根据范围获取其中 3 和 7 整除的所有 ...
- day14函数递归调用
day14函数递归调用 1.装饰器叠加 def deco1(func1): def wrapper1(*args,**kwargs): print('=====>wrapper1 ') res1 ...
- c语言函数, 函数调用及函数递归
1. 函数的定义: 返回值类型 函数名(形参列表) {函数体(函数的实现内容)}, 注意: 如果没有参数, 小括号也是必不可少的. 函数与函数之间可以嵌套调用(也就是在一个函数内部可以调用另外一个函 ...
- Python开发【第一篇】Python基础之函数递归
函数递归 递归的本质: 就是一个函数调用另外一个函数. def d(): return '123' def c(): r = d() return r def b(): r = c() return ...
随机推荐
- Sqli labs系列-less-3 。。。
原本想着找个搜索型的注入玩玩,毕竟昨天被实力嘲讽了 = = . 找了好长时间,我才发现,我没有 = = ,网上搜了一个存在搜索型注入的源码,我看了好长时间,楞没看出来从哪里搜索注入了....估计是我太 ...
- (转)openfire插件开发(一)
转:http://blog.csdn.net/lovexieyuan520/article/details/37774909 1. 在上一篇博文中,我介绍了Openfire3.9.3源代码导入ecli ...
- js滚动到顶部底部代码
<!DOCTYPE HTML> <html> <head> <meta charset=UTF-8> <title>SCROLL</t ...
- 删除maven项目后eclipse无法启动
An internal error occurred during: "reload maven project". java.lang.NullPointerExceptio ...
- PAT_A1080#Graduate Admission
Source: PAT A1080 Graduate Admission (30 分) Description: It is said that in 2011, there are about 10 ...
- sed 删除含有某个字符串的行 (在文件txt)
#删除a.txt中含有“aaa”的行 sed -i “/aaa/d” a.txt
- 拾遗:Go 基础
这 Go,越看越像是 C 和 Python 的混合体--! gofmt 用于格式化代码,缩进使用 tab,而不是空格:Python 官方则建议使用空格,而不是 tab package Go 惯例,使用 ...
- assignment of day four
目录 1.Numeric type (1)integer (2)float Usefulness Define How to use 2.string type Use Define How to u ...
- 第八篇 编写spider爬取jobbole的所有文章
通过scrapy的Request和parse,我们能很容易的爬取所有列表页的文章信息. PS:parse.urljoin(response.url,post_url)的方法有个好处,如果post_ur ...
- nuxt 项目启动报错(HTMLElement is not define nuxt.js)
这两天研究服务端渲染,折腾nuxt,搞得真是心累. 各种报错,nuxt 真是坑多啊,且来说说遇到哪些问题, 1. 搭建nuxt , npx create-nuxt-app <项目名> cd ...