递归:在函数调用的过程中,直接或者间接的调用了函数本身
分为两个阶段:1.回溯(一次次的调用下去,必须要有某个值来结束,否则一直调用下去) 2.递推
def f(): print('你好') f() f() #这样的递归是没有意义的死循环 #而且,在第一次调用f()执行到f()后,又调用自己(但是第一次的f()并未结束),这样执行f()所申请的内存 #空间会越来越多,python则限制了这种情况的发生,抛出异常: --->RecursionError: maximum recursion depth exceeded while calling a Python object
递归要注意的点:
1.递归一定要有一个明确的结束条件
2.问题的规模应该随着递归的次数减小
3.python没有尾递归优化机制
二分法:算法的一种,用于高效率解决一个问题
例如有一个列表:
L = [1,5,3,7,8,11,77,88,99,33,45,98],输入一个数判断是否存在于这个列表之中(除去in等,单纯的用循环实现):
L = [1,5,3,7,8,11,77,88,99,33,45,98] number = int(input('输入一个数字:')) Tage = True while Tage: for i in L: if i == number: print(i) Tage = False break else: print('不存在!') break #如果列表很大,而且被查找元素在很后面,那么就需要遍历几乎整个列表
使用二分法实现:
L = [1,5,3,7,8,11,77,88,99,33,45,98] L.sort() number = int(input('输入要查找的数字:')) count=0 def func(l,count): if len(l) == 0: print('没有找到!') return half = len(l)//2 if number == l[half]: print('找到数字:%s,查找了%d次'%(number,count)) elif number > l[half]: func(l[half+1:],count+1) else: func(l[:half],count+1) func(L,count)