前言:本篇关于递归基本借鉴下面博客讲解加入自己理解。
http://www.cnblogs.com/alex3714/articles/5740985.html)
1.递归函数定义
如果一个函数在函数内部调用自己,那这个函数就是递归函数。如:
defsum(arg,stop):
print(arg)
if arg
arg+=arg
sum(arg,stop)
sum(1,20)
2.递归的特性
1) 必须有一个明确的结束条件,不然进入了死循环。
2) 每次进入更深一层递归时,问题规模相比上次递归都应有所减少
3) 递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
如把上例中return返回值,返回的是最初的栈值:
1 defsum(arg,stop):2 print(arg)3 if arg<4 arg sum returnarg7>
8 print(sum(1,20))9
10 #运行结果
11 1
12 2
13 4
14 8
15 16
16 32
17 2 #返回值一层一层返回arg的值,最后返回最初的栈值
demo
3.应用递归获取斐波那契数列
斐波那契数列是指前两个数加起组成第三个数规律的一组数列,如:0,1,1,2,3,5,8,13.
1 deffunc(arg1,arg2,stop):2 if arg1==0:3 print(arg1,arg2)4 arg3 =arg1+arg25 print(arg3)6 if arg3<7 func>
9 func(0,1,10)10
11 #运行结果
12 0 1
13 1
14 2
15 3
16 5
17 8
18 13
demo
4.应用递归实现二分法查找
当数据量很大时查找,适宜采用二分法。采用二分法查找时,数据需是排好序的,取中间值与查找值比较而取舍一半数据,这样可以缩减查找时间。
1 defbinary_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
demo
7>4>