从前有有座山,山里有座庙,庙里有个老和尚给小和尚们讲故事,讲的什么呀,讲的是,从前有有座山,山里有座庙,庙里有个老和尚给小和尚们讲故事,讲的什么呀?讲的是?......

递归: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 : 函数递归,的更多相关文章

  1. python 之 函数 面向过程 三元表达式 函数递归

    5.11 面向过程编程思想 核心是'过程'二字,过程即解决问题的步骤,即先干什么,再干什么........ 基于面向过程编写程序就好比在设计一条流水线,是一种机械式的思维方式. 总结优缺点: 优点:复 ...

  2. Learning-Python【14】:匿名函数与函数递归

    一.什么是匿名函数 匿名函数就是没有名字的函数,又叫lambda表达式.用于一些简单的需要用函数去解决的问题,特点是只能在定义时使用一次,且函数体只有一行 匿名函数的定义就相当于只产生一个变量的值,而 ...

  3. Python之路Python全局变量与局部变量、函数多层嵌套、函数递归

    Python之路Python全局变量与局部变量.函数多层嵌套.函数递归 一.局部变量与全局变量 1.在子程序中定义的变量称为局部变量,在程序的一开始定义的变量称为全局变量.全局变量作用域是整个程序,局 ...

  4. python基础-函数递归

    函数递归 概念:直接或间接地重复调用函数本身,是一种函数嵌套调用的表现形式. 直接调用:在函数内部,直接调用函数本身 def foo(): print("这是foo函数") foo ...

  5. python函数:匿名函数、函数递归与二分法、面向过程编程

    今天主要讲三大部分内容: 一.匿名函数二.函数递归与二分法三.面向过程编程 一.匿名函数: """ 1. 什么时匿名函数 def定义的是有名函数:特点是可以通过名字重复调 ...

  6. python基础-基础知识(包括:函数递归等知识)

    老男孩 Python 基础知识练习(三) 1.列举布尔值为 False 的值空,None,0, False, ", [], {}, () 2.写函数:根据范围获取其中 3 和 7 整除的所有 ...

  7. day14函数递归调用

    day14函数递归调用 1.装饰器叠加 def deco1(func1): def wrapper1(*args,**kwargs): print('=====>wrapper1 ') res1 ...

  8. c语言函数, 函数调用及函数递归

    1. 函数的定义: 返回值类型 函数名(形参列表) {函数体(函数的实现内容)}, 注意: 如果没有参数, 小括号也是必不可少的.  函数与函数之间可以嵌套调用(也就是在一个函数内部可以调用另外一个函 ...

  9. Python开发【第一篇】Python基础之函数递归

    函数递归 递归的本质: 就是一个函数调用另外一个函数. def d(): return '123' def c(): r = d() return r def b(): r = c() return ...

随机推荐

  1. Mysql LOAD DATA读取客户端任意文件漏洞复现(原理分析)

    环境搭建 怎么设置Mysql支持外联? use mysql; grant all privileges on *.* to root@'%' identified by '密码'; //授权语句 fl ...

  2. TCP/IP报文格式

    1.TCP首部格式 1.1 格式各字段含义 源端口号( 16 位):它(连同源主机 IP 地址)标识源主机的一个应用进程. 目的端口号( 16 位):它(连同目的主机 IP 地址)标识目的主机的一个应 ...

  3. 2、Android自动测试之Monkey工具

    Android自动测试之Monkey工具 APP测试工作中经常会听到领导说,APP压力测试做了吗?刚入行时,不知道什么是 APP压力测试,找了半天没找到自己想要的.过了几年,回头想这个问题,发现牵扯了 ...

  4. POJ 3304 Segments (判断直线与线段相交)

    题目链接:POJ 3304 Problem Description Given n segments in the two dimensional space, write a program, wh ...

  5. ajax 回传参数

    JSONObject json = new JSONObject(); json.put("msg", msg); json.put("success", co ...

  6. keepalive基础知识

    一.LVS负载均衡集群的缺点 二.Keepalived介绍 三.Keepalived的功能 四.Keepalived工作原理 五.Keepalived组件框架 六.Keepalived的安装 6.1 ...

  7. 判断页面是否在iframe中,

    //判断页面是否在iframe中,是的话就跳出iframe框,多用于登录页  ,将此段代码放到要做判断的页面上即可 if (window != top) { top.location.href = l ...

  8. 2019ICPC南京网络赛B super_log

    题意:求a的a的a次方..一直求b次,也就是在纸上写个a,然后一直a次方a次方,对m取模,记为F(a,b,m)=pow(a,F(a,b-1,phi(m)) 解题思路:联系欧拉降幂,这个迭代的过程,我们 ...

  9. 继续搞我的linux

    小程序研发已经告一段落,还是继续我的Linux研究.上次因为捣鼓那个fastab,结果吧虚拟机搞崩溃了.好吧,这次老子来装正式机,从机房拉来了一台破烂货,联想的老式服务器,开工吧. 用UltraISO ...

  10. ZMQ相关

    一般来说,做bind的是服务端,做connect的是客服端.zmq的bind和connect与我们通常的socket中bind和connect是不一样的,最起码的,我们它没有启动的先后顺序,而在我们通 ...