前言:本篇关于递归基本借鉴下面博客讲解加入自己理解。
http://www.cnblogs.com/alex3714/articles/5740985.html)
1.递归函数定义
如果一个函数在函数内部调用自己,那这个函数就是递归函数。如:
def sum(arg,stop):
print(arg)
if arg<stop:
arg+=arg
sum(arg,stop)
sum(1,20)
2.递归的特性
1) 必须有一个明确的结束条件,不然进入了死循环。
2) 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3) 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
如把上例中return返回值,返回的是最初的栈值:
1 def sum(arg,stop): 2 print(arg) 3 if arg<stop: 4 arg+=arg 5 sum(arg,stop) 6 return arg 7 8 print(sum(1,20)) 9 10 #运行结果 11 1 12 2 13 4 14 8 15 16 16 32 17 2 #返回值一层一层返回arg的值,最后返回最初的栈值
3.应用递归获取斐波那契数列
斐波那契数列是指前两个数加起组成第三个数规律的一组数列,如:0,1,1,2,3,5,8,13.
1 def func(arg1,arg2,stop): 2 if arg1==0: 3 print(arg1,arg2) 4 arg3 =arg1+arg2 5 print(arg3) 6 if arg3<stop: 7 func(arg2,arg3,stop) 8 9 func(0,1,10) 10 11 #运行结果 12 0 1 13 1 14 2 15 3 16 5 17 8 18 13
4.应用递归实现二分法查找
当数据量很大时查找,适宜采用二分法。采用二分法查找时,数据需是排好序的,取中间值与查找值比较而取舍一半数据,这样可以缩减查找时间。
1 def binary_search(data_source,find_n): 2 mid=int(len(data_source)/2) 3 if len(data_source)>1: 4 if data_source[mid] > find_n: #data in left 5 print('data in left of [%s]'%data_source[mid]) 6 binary_search(data_source[:mid],find_n) 7 elif data_source[mid] < find_n: #data in right 8 print('data in left of [%s]'%data_source[mid]) 9 binary_search(data_source[mid:],find_n) 10 else: 11 print('found find_s:',data_source[mid]) 12 else: 13 print('cannot find ....') 14 15 if __name__=='__main__': 16 data = list(range(1,50000)) 17 binary_search(data,36378) 18 19 #运行结果 20 data in left of [25000] 21 data in left of [37500] 22 data in left of [31250] 23 data in left of [34375] 24 data in left of [35937] 25 data in left of [36718] 26 data in left of [36327] 27 data in left of [36522] 28 data in left of [36424] 29 data in left of [36375] 30 data in left of [36399] 31 data in left of [36387] 32 data in left of [36381] 33 found find_s: 36378