Python之递归函数
递归函数
1. 递归(recursion)一个函数在内部调用了自己,这种写法就叫做递归。
def func(): # 每次调用一个函数,就会开辟一块内存空间 print("djgdl") func() # 在内部调用自己 print(123) # 这句话不会打印 func()
2. 关于递归函数
1. 递归函数必须有一个结束条件,递归并不是无限制的,在python中默认最大深度是997或998。
2. 分析的流程拿到返回值,到一个结束条件的时候叫做递,返回值计算的时候叫做归。一定有递推的过程,不一定有回归的过程。
3. 最大递归深度
import sys sys.setrecursionlimit(100000000) # 修改递归最大深度,一般不要去修改 COUNT = 0 def func(): global COUNT COUNT += 1 print(COUNT) func() func()
4. 二分查找(重点)
def search(num,l,start=None,end=None): start = start if start else 0 # start是开始查找的位置 end = end if end else len(l)-1 # end是结束查找的位置 mid = (end - start) // 2 + start #//是取到整数 if start > end: # 这里是当要查找的值不存在的时候,就返回一个None return None elif l[mid] > num: return search(num,l,start,mid-1) elif l[mid] < num: return search(num,l,mid+1,end) elif l[mid] == num: return mid,l[mid] 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] print(search(66,l)) # 递推 :这个程序只有递推的过程,没有回归返回值的过程 def search(66,l,start=None,end=None): # 一开始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] start = start if start else 0 end = end if end else 25-1 mid = (24 - 0) // 2 + 0 =12 elif 41 < 66: return search(66,l,12+1,24) def search(66,l,start=13,end=24): #search(66,l,12+1,24) # 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] start = start if start else 0 end = end if end else len(l)-1 mid = (24 - 13) // 2 + 13 =18 elif 67 > 66: return search(66,l,13,17) def search(66,l,start=13,end=17): #search(66,l,13,17) # 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] start = start if start else 0 end = end if end else len(l)-1 mid = (17 - 13) // 2 + 13 = 15 elif 55 < 66: return search(66,l,17,17) def search(66,l,start=16,end=17): #search(66,l,16,17) # 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] start = start if start else 0 end = end if end else len(l)-1 mid = (17 - 17) // 2 + 17 elif 66 == 66: return 17,66
示例一: 1 的年龄问题 ,1 的年龄不知道,比 2 大2岁,2 比 3 大2岁,3 比 4 大2岁,4 的年龄是40
def age(n): if n == 4: return 40 return age(n+1)+2 ret = age(1) print(ret) # 递的过程: def age(1): return age(1+1)+2 def age(2): return age(2+1)+2 def age(3): return age(3+1)+2 def age(4): if n == 4: return 40 # 归的过程,从下往上返回值 age(1) = 46 def age(1): return age(2)+2 age(2) = 44 def age(2): return age(3)+2 age(3) = 42 def age(3): return age(4)+2 age(4) = 40 def age(4): if n == 4: return 40
示例二: 求阶乘 7*6*5*4*3*2*1
def func(n): if n == 1: return n return n*func(n-1) ret = func(7) print(ret) # 递推 def func(7): return 7*func(7-1) def func(6): return 6*func(6-1) def func(5): return 5*func(5-1) def func(4): return 4*func(4-1) def func(3): return 3*func(3-1) def func(2): return 2*func(2-1) def func(1): if 1 == 1: return 1 # 回归 func(7)=5040 def func(7): return 7*func(7-1) func(6)=720 def func(6): return 6*func(6-1) func(5)=120 def func(5): return 5*func(5-1) func(4)=24 def func(4): return 4*func(4-1) func(3)=6 def func(3): return 3*func(3-1) func(2)=2 def func(2): return 2*func(1) func(1)=1 def func(1): if 1 == 1: return 1
示例三:三级菜单
menu = { '北京': { '海淀': { '五道口': { 'soho': {}, '网易': {}, 'google': {} }, '中关村': { '爱奇艺': {}, '汽车之家': {}, 'youku': {}, }, '上地': { '百度': {}, }, }, '昌平': { '沙河': { '老男孩': {}, '北航': {}, }, '天通苑': {}, '回龙观': {}, }, '朝阳': {}, '东城': {}, }, '上海': { '闵行': { "人民广场": { '炸鸡店': {} } }, '闸北': { '火车战': { '携程': {} } }, '浦东': {}, }, '山东': {}, } def three_menu(menu): while True: for k in menu:print(k) key = input(">>>") if key.lower() =="q":return "q" # return 一个q 就需要有变量去接收 elif key == "b":break # 当输入b的时候,就break,这里break是只能返回上一层,是因为有while,如果单独return和break的效果是一样的,所以下面才需要有个变量去接受 elif key in menu: ret = three_menu(menu[key]) # 这里的ret就是去接收return回来的 q 的 if ret == "q":return "q" # 当ret=q的时候,就直接再return q 这样就保证了用户输入q,就会直接退出 three_menu(menu)