def backtrack(state: State, choices: list[choice], res: list[state]):
"""回溯算法框架"""
# 剪枝
if n == is_End:
# 剪枝开始回退
return
# 判断是否为解
if is_solution(state):
# 记录解
record_solution(state, res)
# 停止继续搜索
return
# 遍历所有选择
for choice in choices:
# 剪枝:判断选择是否合法
if is_valid(state, choice):
# 尝试:做出选择,更新状态
make_choice(state, choice)
backtrack(state, choices, res)
# 回退:撤销选择,恢复到之前的状态
undo_choice(state, choice)
注意:
python中,回溯算法在递归过程中会修改同一个变量(比方说我们去计算的结果),如果使用str、int等不可二次修改的类型来保存,可能会得到意料之外的结果。所以,推荐用list操作。
当然,也可以将变量通过形参传入函数内,弄清楚递归之间的关系即可。