第二模块 3.8 函数的递归
举例:
求100不断除以2直到商为0为止,打印每次除的商
n = 100 while n >0: n = int(n/2) print(n)
用递归函数表示:
def calc(n): n = int(n/2) print(n) if n >0: calc(n) calc(100)
如果一个函数在内部调用自已本身,这个函数就叫做递归函数。上面我们写的这个代码就是递归
def calc(n): n = int(n/2) print(n) if n >0: calc(n) print(n) calc(100)
递归特性:
-
必须有一个明确的结束条件
-
每次进入更深一层递归时,问题规模相比上次递归都应有所减少
-
递归效率不高,递归层次过多会导致栈溢出(在计算机中,函数调用是通过栈(stack)这种数据结构实现的,每当进入一个函数调用,栈就会加一层栈帧,每当函数返回,栈就会减一层栈帧。由于栈的大小不是无限的,所以,递归调用的次数过多,会导致栈溢出)
练习题
用递归实现2分查找的算法,以从列表 a = [1,3,4,6,7,8,9,11,15,17,19,21,22,25,29,33,38,69,107] 查找指定的值。
a = [1,3,4,6,7,8,9,11,15,17,19,21,22,25,29,33,38,69,107] def binary_search(start, end, n , data_list): mid = (start+end)//2 if data_list[mid]>n : print("go left", start, mid, end,"--", data_list[start],data_list[mid],data_list[end-1]) binary_search(start, mid, n, data_list) elif data_list[mid] <n: print("go right", mid+1, end, "--", data_list[start],data_list[mid],data_list[end-1]) binary_search(mid+1, end, n , data_list) else: print("find it", data_list[mid],mid) binary_search(0,len(a),22, a)