递归函数
mport sys #所有和python相关的设置和方法 sys.setrecursionlimit(10000000) n = 0 def f(): global n n += 1 print(n) f() f()
def story(): print("从前有座山,山里有座庙,庙里有个老和尚讲故事,讲的什么呀?") while True: story()
递归:
在一个函数里调用自己
python递归最大层数限制 997
最大层数限制是python默认的,可以做修改
但是不建议你修改
递归实例:
def age(n): if n == 1: return 40 else: ret = age(n-1) return ret + 2 age(5)
结束递归的标志:return
递归三级菜单:
menu = { '北京': { '海淀': { '五道口': { 'soho': {}, '网易': {}, 'google': {} }, '中关村': { '爱奇艺': {}, '汽车之家': {}, 'youku': {}, }, '上地': { '百度': {}, }, }, '昌平': { '沙河': { '老男孩': {}, '北航': {}, }, '天通苑': {}, '回龙观': {}, }, '朝阳': {}, '东城': {}, }, '上海': { '闵行': { "人民广场": { '炸鸡店': {} } }, '闸北': { '火车战': { '携程': {} } }, '浦东': {}, }, '山东': {}, } def threeLM(menu): for key in menu: print(key) k = input(">>>") if k in menu: threeLM(menu[k]) threeLM(menu)
递归二分法:
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)) num = 0 for i in l: if i == 66: print(num) num += 1
l = [2,3,5,10,15,16,18,22,26] def find(l,aim): #l:列表 aim:要找的 mid = len(l)//2 #计算中点 if l[mid] > aim: # 判断中间位置的值和目标值的大小关系 new_l = l[:mid] #[16,18] = [16,18,22,26][:mid] return find(new_l,aim) elif l[mid] < aim: #判断中间位置的值和目标值的大小关系 new_l = l[mid+1:] return find(new_l,aim) else: return l[mid] print(find(l,16))
l = [2,3,5,10,15,16,18,22,26] def find2(l,aim,start,end):#[2,3,5,10,15,16,18,22,26] 0,8 mid = (end+start)//2 #4 #5+8/2=6 #start =5 end = 5 mid = 5 if start < end: if l[mid] > aim: #15 17 #18 17 end = mid -1 #end =6-1 = 5 return find2(l,aim,start,end) elif l[mid] < aim: #15 17 start = mid + 1 # start = 5 return find2(l, aim, start, end) else: return mid else: return "找不到" print(find2(l,18,start=0,end = len(l)-1))
递归解决的问题
就是通过参数,来控制每一次调用缩小计算的规模
适合的场景
数据的规模在减小,但是解决问题的思路没有改变
结束递归的标志:return
def func(num): print(num) if num == 1: return if num %2 == 0: num = num //2 else: num = num * 3 + 1 func(num) func(5)