python基础----递归函数(二分法、最大深度递归)
递归函数
定义:在函数内部,可以调用其他函数。如果一个函数在内部调用自身本身,这个函数就是递归函数。
1 #例子1 2 # age(5)=age(4)+2 n=5 age(n)=age(n-1)+2 3 # age(4)=age(3)+2 n=4 age(n)=age(n-1)+2 4 # age(3)=age(2)+2 n=3 age(n)=age(n-1)+2 5 # age(2)=age(1)+2 n=2 age(n)=age(n-1)+2 6 # age(1)=10 n=1 age(n)=10 7 8 # n=1 res=10 9 # n>1 res=age(n-1)+2 10 11 #递归------------代码实现 12 def age(n): 13 if n == 1: 14 return 10 15 else: 16 return age(n-1)+2 #age(4)+2 17 print(age(5))
递归特性:
1. 必须有一个明确的结束条件
2. 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3. 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
1 data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35] 2 # num=19 3 # i=0 4 # while True: 5 # if num == data[i]: 6 # print('find it') 7 # break 8 # i+=1 9 10 def search(num,data): 11 print(data) 12 if len(data) > 1: 13 #二分 14 mid_index=int(len(data)/2) 15 mid_value=data[mid_index] 16 if num > mid_value: #19>18 17 #num在列表的右边 18 data=data[mid_index:] #data[0:]-->[18] 19 search(num,data) 20 elif num < mid_value: 21 #num在列表的左边 22 data=data[:mid_index] 23 search(num,data) 24 else: 25 print('find it') 26 return 27 else: 28 if data[0] == num: 29 print('find it') 30 else: 31 print('not exists') 32 33 # search(9527,data) 34 search(15,data) 35 # search(1,data)
1 import sys 2 sys.setrecursionlimit(10000) #setrecursionlimit 最大递归深度 3 4 def func(n): 5 if n == 10: 6 return 7 print('from func') 8 func(n-1) 9 10 func(10)