初识递归
递归的定义——在一个函数里再调用这个函数本身
现在我们已经大概知道刚刚讲的story函数做了什么,就是在一个函数里再调用这个函数本身,这种魔性的使用函数的方式就叫做递归。
刚刚我们就已经写了一个最简单的递归函数。
递归的最大深度——997
正如你们刚刚看到的,递归函数如果不受到外力的阻止会一直执行下去。但是我们之前已经说过关于函数调用的问题,每一次函数调用都会产生一个属于它自己的名称空间,如果一直调用下去,就会造成名称空间占用太多内存的问题,于是python为了杜绝此类现象,强制的将递归层数控制在了997(只要997!你买不了吃亏,买不了上当...).
拿什么来证明这个“997理论”呢?这里我们可以做一个实验:
#初识递归
# def story():
# print('gushide neirongshi ')
# story()
# story()
#
#多大了alex,我不告诉你,alex比egon大两岁 44+2
#egon多大了,我不告诉你,egon比wusir大两岁 42+2
#wusir多大了,我不告诉你,wusir比金鑫大两岁 40+2
#金鑫40了
def age(n): # if n==4: # return 40 # return age(n+1)+2 # print(age(1)) # #以下是拆解的分析过程 # def age(4): # if 4==4: # return 40 # # return age(3+1)+2 n=4 这一步不执行 # def age(3): # if 3==4: #3!=4这一步不执行 # return 40 # return age(3+1)+2 #根据age4的到age3的内容 age(3)=40+2=42 # def age(2): # if 2==4: #2!=4这一步不执行 # return 40 # return age(2+1)+2#根据age3的到age2的内容 age(2)=42+2=44 # def age(1): # if 1==4: #1!=4这一步不执行 # return 40 # return age(1+1)+2#根据age2的到age1的内容 age(1)=44+2 #最后也是开始调用了age(1)想得到到他得结果,print(age(1)) #
二分找法
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(l.index(66))#最传统的放法 #初级递归 # 但是1不能显示他的索引位, # # def func(l,n): # mid=len(l)//2 # if l: # if l[mid]>n: # new_l=l[:mid] # func(new_l,n) # elif l[mid]<n: # new_l=l[mid+1:] # func(new_l,n) # elif l[mid]==n: # print(n,mid) # else: # print('数字不在内部') # func(l,68)
def func(l,n,start=0,end=None):#第一个问题,传参,这样传参数,就不会对函数进行切割, if end==None:#而是去下标范围内的数值,l 不变 end=len(l)-1 if start < end: #当函数不存在时会出现func(l,n,mid+1,end)中的mid+1>end mid=(start+end)//2# 因为取到所有的值了,此时end=0 if l[mid]>n: func(l,n,start,mid)#这个是取的区间,而为改变列表 elif l[mid]<n: func(l,n,mid+1,end) elif l[mid]==n: print(n,mid) else: print('数字不在内部') func(l,67,start=0,end=None)
三级菜单
menu = { '北京': { '海淀': { '五道口': { 'soho': {}, '网易': {}, 'google': {} }, '中关村': { '爱奇艺': {}, '汽车之家': {}, 'youku': {}, }, '上地': { '百度': {}, }, }, '昌平': { '沙河': { '老男孩': {}, '北航': {}, }, '天通苑': {}, '回龙观': {}, }, '朝阳': {}, '东城': {}, }, '上海': { '闵行': { "人民广场": { '炸鸡店': {} } }, '闸北': { '火车战': { '携程': {} } }, '浦东': {}, }, '山东': {}, } def o_menu(menu): while True: for key in menu: print(key) select=input('选择') if select=="q": return 'q' if select=='b': return 'b' if select in menu and menu[select]: 这句话的意思是满足select在menu中,而且 下一级为字典,不是空的情况 borq= o_menu(menu[select])#这儿跟send有点像,执行到这儿return o_menu(menu[select]) if borq=='q': #但是当能够执行下去的话,在下一次循环中我输入了b 就会把b return给 return 'q'#上一次调用的函数就是 o_menu(menu[select]) 然后就borq =="b"了什么也不做 o_menu(menu) #当等于'q"时,就会返回给上次的函数,直到跳出