1 如何理解“递归”
递归是一种应用非常广泛的算法(或者编程技巧),通过一个函数在执行过程中一次或多次调用其本身,或者通过一种数据结构在其表示中依赖于相同的类型的结构或者更小的实例。之后我们要讲的很多数据结构和算法的编码实现都要用到递归,比如 DFS 深度优先搜索、前中后序二叉树遍历等等。所以,搞懂递归非常重要,否则,后面复杂一些的数据结构和算法学起来就会比较吃力。
2 递归需要满足的三个条件
1 一个问题的解可以分解为几个子问题的解
2 这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样
3 存在递归终止条件
3 说明性的例子
1 实现一个数的阶乘
def factorial(n):
if n == 1:
return 1
return n*factorial(n-1)
这个函数没有任何显式循环
我们使用递归跟踪的形式来说明一下factorial(4)的执行过程。
每当一个函数被调用时,都会创建一个被称为活动记录或框架的结构来储存信息,这个活动记录包含一个用来存储函数调用的参数以及局部变量的命名空间
2 计算一个文件系统磁盘使用情况的递归函数
先讲一下即时磁盘空间以及累计磁盘空间
比如有一个文件夹(或文件),它本身占一定的空间,就是即时磁盘空间,此文件夹里面的视频,图片等其他文件或文件夹所有的磁盘空间总和为累计磁盘空间。
import os
def disk_usage(path):
# 得到目录的即时磁盘空间
total = os.path.getsize(path)
# 递归的结束条件,当传入的路径指定的是一个文件夹时执行,也就是遍历完文件夹里所有的文件夹。直到没有下一级
if os.path.isdir(path):
# 依次遍历目录下的所有新目录
for filename in os.listdir(path): # 生成新目录的路径字符串
childpath = os.path.join(path,filename)
total += disk_usage(childpath) # 递归
print(total,path)
return total
先创建一个ddd的文件
文件ddd里面创建两个目录
aaa里面写入bbb txt 文件,eee里面创建fff txt 文件
执行下面代码
file_path = r'D:\ddd'
print(disk_usage(file_path))
运行结果为
5 D:\ddd\aaa\bbb.txt
5 D:\ddd\aaa
5 D:\ddd\eee\fff.txt
5 D:\ddd\eee
10 D:\ddd
10
3 二分查找
二分查找用于在一个有序的序列中寻找特定的元素,
其原理用伪代码表示,data 表示有序序列,target 表示要查找的元素,mid表示中间元素的索引
伪代码
def binary_search(data,target):
mid = 序列data除以2(取整)
如果 target 等于 data[mid]:
return Ture
如果 target 小于 data[mid]:
对小于data[mid]的数进行二分法
如果 target 大于 data[mid]:
对大于data[mid]的数进行二分法
代码实现
def binary_search(data,target):
if len(data) <= 0:
return False
mid = len(data) // 2
if target == data[mid]:
return True
if target < data[mid]:
return binary_search(data[:mid -1],target)
elif target > data[mid]:
return binary_search(data[mid + 1:],target)
由于二分查找不用遍历序列,都是一半一半进行查找,所以时间复杂度为O(logn)