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 ...
随机推荐
- SDOI2017 树点染色
\[SDOI2017 树点染色\] 题目描述 Bob 有一棵 $ n $ 个点的有根树,其中 $ 1 $ 号点是根节点.Bob 在每个节点上涂了颜色,并且每个点上的颜色不同. 定义一条路径的权值是,这 ...
- python数据结构之快速排序
def quick_sort(nums): if not nums: return [] else: # 这里取第0个数为基点 flag = nums[0] # 小于flag 的放到左边 left = ...
- 欧拉筛 线性筛 素数+莫比乌斯的mu[]
https://blog.csdn.net/qq_39763472/article/details/82428602 模板来自https://blog.csdn.net/Avalon_cc/artic ...
- 自动化监控系统(三) 搭建xadmin做网站后台
Django有个自带的admin后台,不过界面不怎么好看,这里我用xadmin 我的python版本是3.5,可以使用支持py3的xadmin:https://github.com/sshwsfc/x ...
- react-swiper 如何实现滑动小卡片的移动?
1.引入插件 import ReactSwipes from 'react-swipes'; import './swiperCard.css'; 2.代码构成 export default clas ...
- winform 窗体拖动
winform 由于自带的界面太丑,有时候就想着去掉标题栏,自己写,自己做UI 但是发现没法拖动了,或者,有时候我们也想让整个窗体都能够随着鼠标进行拖动,来来来,看下面 #region 让窗口可以随意 ...
- 【HDOJ】P5056 Boring count
题目意思是给你一个字符串和K,让你求其中有多少个字串中每个字母的出现次数不超过K次,可以等于 题目意思是很简单的,写起来也很简单,不过就是注意最后要是long long要不WA了,555~ #incl ...
- debug breakpoint with maven in eclipse
- oracle密码过期,改为原来的密码
我们都知道Oracle 数据库的用户的密码默认是有有效期限制的,特别是在Cloud上面的DB,有些用户是Cloud自动创建的,我们不知道原来的密码是什么,但是如果密码过期了,如果修改成新的密码,会影响 ...
- MySQL 开始
安装,配置环境变量啥的,网上一抓一大堆,不说了.就说我再实际操作中遇到的问题. 1 添加自增列 点击apply,直接提示一个错误....百思不得其解..上图... 添加不了自增列....好恐怖.. ...