1.递归执行过程:如果一个函数的执行导致嵌套函数的调用,那么前者调用的执行将会挂起,其活动记录(每当一个函数被调用时都会创建一个活动记录,用来存储其调用的参数和局部变量的命名空间,以及这个函数当前正在执行的命令的信息)将存储源代码中的位置,这个位置是被调用函数返回后将继续执行的控制流。
2.例1:二分查找算法
def binary_search(data, target, low, high):
if low > high:
return False
mid = (high + low) // 2
if data[mid] == target:
return True
elif data[mid] > target:
return binary_search(data, target, low, mid-1)
else:
return binary_search(data, target, mid+1, high)
该查找算法会一直迭代下去到函数返回True或者False为止,然后将结果一直传递,传递给最初调用的函数作为最后的结果,每一次递归之后,需要被查找的候选条目数至少减少了一半,其时间复杂度为O(logn)
例2:计算嵌套在一个特定目录中的所有文件和目录的总磁盘使用情况(思路:一个目录的总磁盘空间为该目录所使用的即时磁盘空间和其下所嵌套目录的累计磁盘空间)
import os
def disk_usage(path):
total = os.path.getsize(path)
if os.path.isdir(path):
for filename in os.path.dirlist(path):
childpath = os.path.join(path, filename)
total += disk_usage(childpath)
print('{0:<7}'.format(total), path)
return total
递归执行时,函数的活动记录存储在print函数之上的位置,print函数的执行与递归函数调用的顺序是刚好相反的。显然该函数有O(n)次递归调用,每次递归调用在循环外部使用O(1)的时间,并且循环操作的总数是O(n),所以这个函数的时间复杂度为O(n)。