一、递归
首先引入一个例子
def story(): s = """ 从前有个山,山里有座庙,庙里老和尚讲故事, 讲的什么呢? """ print(s) story() story()
在一个函数里再调用这个函数本身,其最大层数限制是997,最大层数限制是python默认的
结束递归的标志是:return
修改递归最大深度的手段(一般情况下还是别修改比较好)
import sys sys.setrecursionlimit(1000000) n=0 def f(): global n n+=1 print(n) f() f()
递归解决的问题:
#就是通过参数,来控制每一次调用缩小计算的规模
#适合的场景
#数据的规模在减小,但是解决问题的思路没有改变
练习:
1.猜年龄游戏
#猜e的年龄 #e比d大两岁 #d比c大两岁 #c比b大两岁 #b比a大两岁 #a 40了 # 1.a age(1) = 40 # 2.b age(1) + 2 # 3.c age(2) + 2 # 4.d age(3) + 2 # 5.e age(4) + 2 def age(n): if n == 1: return 40 else: ret = age(n-1) return ret + 2 age(5)
2.如果一个数可以整除2,就整除,不能整除(*3+1)
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)
3.一个数除2到不能整除2为止
def cal(num): if num % 2 == 0: num = num // 2 return cal(num) else: return num print(cal(8))
递归函数与三级菜单
def threeLM(dic): while True: for k in dic:print(k) key = input('input>>').strip() if key == 'b' or key == 'q':return key elif key in dic.keys() and dic[key]: ret = threeLM(dic[key]) if ret == 'q': return 'q' elif (not dic.get(key)) or (not dic[key]) : continue threeLM(menu)
二、二分查找算法
如果有这样一个列表,让你从这个列表中找到66的位置,你要怎么做?
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]
二分查找算法
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]
你观察这个列表,这是不是一个从小到大排序的有序列表呀?
如果这样,假如我要找的数比列表中间的数还大,是不是我直接在列表的后半边找就行了?
这就是二分查找算法!
简单二分法
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] def func(l,aim): mid = (len(l)-1)//2 if l: if aim > l[mid]: func(l[mid+1:],aim) elif aim < l[mid]: func(l[:mid],aim) elif aim == l[mid]: print("bingo",mid) else: print('找不到') func(l,66) func(l,6) 二分法基础版
def func(l, aim,start = 0,end = len(l)-1 ): mid = (start+end)//2 if not l[start:end+1]: return elif aim > l[mid]: return func(l,aim,mid+1,end) elif aim < l[mid]: return func(l,aim,start,mid-1) elif aim == l[mid]: print("bingo") return mid index = func(l,68) print(index) 二分法查找升级版