前言:本篇关于递归基本借鉴下面博客讲解加入自己理解。

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的值,最后返回最初的栈值
demo

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
demo

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
demo