回溯搜索
使用回溯算法找到所有固定长度的排列数。回溯算法与函数递归是密不可分的,回溯算法类似于深度优先搜索算法,有序暴力遍历每条路径。
最关键的是四个步骤
* 1. 确定参数
* 2. 确定终止条件
* 3. 确定单层递归逻辑
* 4. 确定回溯逻辑
path = [] # 保存每条搜索路径
result = [] # 保存所有路径
def backtracking(n, k, satrt_index):
if len(path) == k:
# 注意此处不能直接添加而应该浅拷贝,否则会得到空列表
result.append(path.copy())
return
for i in range(satrt_index, n):
path.append(i)
backtracking(n, k, i+1)
# 回溯关键按步骤
path.pop()
return
backtracking(4, 2, 0)
print(result)
输出结果
[[0, 1], [0, 2], [0, 3], [1, 2], [1, 3], [2, 3]]
剪枝操作
path = [] # 保存每条搜索路径
result = [] # 保存所有路径
def backtracking(n, k, satrt_index):
if len(path) == k:
result.append(path.copy())
return
# 唯一修改地方
for i in range(satrt_index, n-(k-len(path))+1):
path.append(i)
backtracking(n, k, i+1)
path.pop()
return
backtracking(4, 2, 0)
print(result)