一. 递归函数
如果一个函数在内部调用自身本身,这个函数就是递归函数。
最大递归深度默认是997 -- python从内存角度出发做得限制(而不是程序真的报错),最大深度可以修改
def func(n): print(n) func(n+1) func(1)
‘’‘ 改变最大递归深度,根据自身电脑配置,深度各不相同 ’‘’ import sys sys.setrecursionlimit(1000000)
举个例子:
现在你们问我,alex老师多大了?我说我不告诉你,但alex比 egon 大两岁。
你想知道alex多大,你是不是还得去问egon?egon说,我也不告诉你,但我比武sir大两岁。
你又问武sir,武sir也不告诉你,他说他比金鑫大两岁。
那你问金鑫,金鑫告诉你,他40了。。。
这个时候你是不是就知道了?alex多大?
age(4) = age(3) + 2 age(3) = age(2) + 2 age(2) = age(1) + 2 age(1) = 40
def age(n): if n == 4: return 40 elif n > 0 and n < 4: return age(n+1) + 2 print(age(1))
def age(1): if 1 == 4: return 40 elif 1 > 0 and 1 < 4: return age(1+1) + 2 返回给age(1) def age(2): if 2 == 4: return 40 elif 2 > 0 and 2 < 4: return age(2+1) + 2 返回给上一个的age(1+1) def age(3): if 3 == 4: return 40 elif 3 > 0 and 3 < 4: return age(3+1) + 2 返回给上一个的age(2+1) def age(4): if 4 == 4: return 40 elif 4 > 0 and 4 < 4: return age(4+1) + 2 返回给上一个的age(3+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]
def find(l,aim): mid_index = len(l) // 2 if l[mid_index] < aim: new_l = l[mid_index + 1:] find(new_l,aim) elif l[mid_index] > aim: new_l = l[:mid_index] find(new_l,aim) else: print('找到了',mid_index,l[mid_index]) # 下标不对,怎么改? find(l,66)
def find(l,aim,start = 0,end = len(l)): mid_index = (end - start) // 2 + start # 计算中间值 if l[mid_index] < aim: find(l,aim,start = mid_index + 1,end = end) elif l[mid_index] > aim: find(l, aim, start=start, end= mid_index - 1) else: print('找到了',mid_index,l[mid_index]) find(l,66) # 找到了 17 66
有问题:
1. 参数 end
2. 返回值
3. 找不到怎么办?
def find(l,aim,start = 0,end = None): end = len(l) if end is None else end mid_index = (end - start) // 2 + start # 计算中间值 if start <= end: if l[mid_index] < aim: return find(l,aim,start = mid_index + 1,end = end) elif l[mid_index] > aim: return find(l, aim, start=start, end= mid_index - 1) else: return mid_index else: return '找不到这个值'