递归调用:在函数调用过程中,直接或间接的调用了函数本身,这就是函数的递归调用
1、必须有一个明确的结束条件,当满足条件时结束递推,进行回溯
2、每次进入更深一层递归时,问题规模相比上次递归都应该有所减少
3、递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用时通过栈stack这种数据结构实现的,
每当进入一个函数调用,栈就会增加一层栈帧,每当函数返回,栈就会减少一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出。
4、简单运用:
def f1(): print('from f1') f1() f1() #超出设置的递归次数:RecursionError: maximum recursion depth exceeded while calling a Python object
5、查看及设置递归次数
import sys print(sys.getrecursionlimit()) #1000 查询出设置的最多可以递归多少层 sys.setrecursionlimit(10000) # print(sys.getrecursionlimit()) #10000
6、递推年龄
#有几个人,最小的18岁,每个人都比上一个人大2岁,用递归的方法得到第n个人的年龄 def age(n): if n == 1: return 18 return age(n-1)+2 print(age(5)) #26
7、二分法运用:
l = [1,3,5,7,9,14,16,17,22,55,66,77,88,99,101,200] def search(find_num,seq): if len(seq) == 0:#判断是否为空列表,如果不判断,后面切到最后就是一个空列表,IndexError: list index out of range print('not find') return mid_index = len(seq)//2 #地板除,得到整数,1//2=0 ,3//2=1 ,2//2 =1 mid_num = seq[mid_index] if find_num > mid_num: seq = seq[mid_index+1:] search(find_num,seq) elif find_num < mid_num: seq = seq[:mid_index] search(find_num,seq) else: print('find it') search(87,l)