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

递归: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. Win7下使用DbgPrint

    在Win7下默认DbgPrint输出信息后,使用DbgView看不到内容. 新建一个reg文件,双击导出就行了. Windows Registry Editor Version 5.00 [HKEY_ ...

  2. 杂项-.Net-HQL:HQL

    ylbtech-杂项-.Net-HQL:HQL HQL是Hibernate Query Language的缩写,提供更加丰富灵活.更为强大的查询能力:HQL更接近SQL语句查询语法. 1.返回顶部 1 ...

  3. windows每天定时执行脚本

     windows每天定时执行脚本 这里说的定时器就是Windows下的任务计划,当时遇到的坑正好总结一下,因为Windows10的定时器去执行脚本当时试了好多遍,都是没有成功,后来通过自己的观察发现是 ...

  4. Collection map

    HashMap 的工作原理及代码实现 底层数组+链表实现,可以存储null键和null值,线程不安全 初始size为16,扩容:newsize = oldsize*2,size一定为2的n次幂 扩容针 ...

  5. The 2019 Asia Nanchang First Round Online Programming Contest(B,E)

    B. Fire-Fighting Hero 题意:一个消防员和多个队伍比赛,比较所有地方的最短路的最大值,消防员最后的值要乘1/C,求胜利的一方的最短路的最大值是多少.一直没读懂正确题意(内疚). 思 ...

  6. 将本地已有的一个项目上传到新建的git仓库的方法

    将本地已有的一个非git项目上传到新建的git仓库的方法一共有两种. 一. 克隆+拷贝 第一种方法比较简单,直接用把远程仓库拉到本地,然后再把自己本地的项目拷贝到仓库中去.然后push到远程仓库上去即 ...

  7. hdu6315 /// 线段树区间更新

    题目大意: 给定n q 为序列的个数和操作的个数 给定n个数的序列b[]作为分母 初始全为0的序列a[]作为分子 两种操作 add l r 为a[]的l到r区间全部+1 query l r 为查询l到 ...

  8. Windows进程调度相关

    结构体所在环境: Windows XP Version 2600 (Service Pack 3) UP Free x86 compatible EPROCESS: ntdll!_EPROCESS + ...

  9. jsonp的实现原理

    jsonp的实现原理 由于浏览器的安全性(同源策略)限制,不允许AJAX访问协议不同或域名不同或端口号不同的数据接口: 可以通过动态创建script标签的方式,把script标签的src属性指向数据接 ...

  10. python pathlib模块详解

    python pathlib模块详解