回溯法是一种通过一步步做出选择、沿着可选方向推进、在到达合适节点后整理结果并继续探索其他方向的方法。可以把回溯法理解成一棵探索树:从初始状态出发,列出当前可选选择,选择一个方向进入下一层;如果当前路线形成完整结果,就记录答案;如果还有可选方向,就返回上一个选择点,选择新的方向继续推进。回溯法适合用来梳理排列、组合、子集、路径选择、约束方案这类需要逐步做决定的任务。
适合用回溯法的原因
- 很多任务需要先做选择,后面的选择会受到前面选择影响。
- 回溯法可以把每一步选择都展开,形成清晰的探索路线。
- 回溯法适合“先选择,再前进,再返回,再换方向”的流程。
- 回溯法能把多个可选答案系统地梳理出来,方便记录完整结果。
基本步骤
- 定义初始状态
明确从哪里开始探索,例如空数组、空路径、起始坐标、初始集合。
- 列出当前选择
在当前状态下,把可以推进的方向列出来,例如可选数字、可走方向、可选元素、可填位置。
- 选择一个方向
从当前选择中挑一个可推进方向,把它加入路径、集合或当前状态。
- 进入下一层
通过递归或栈的方式,从当前选择继续进入更深层探索。
- 判断完整方案
当当前选择已经形成目标结果时,记录答案。
- 返回上一选择点
回到上一次做选择的位置,把刚才加入的方向撤销,再尝试另一个方向。
- 继续探索
对所有方向按同样流程推进,直到需要的结果被梳理完整。
典型场景
| 场景 | 可找到的结果 | 回溯法承担的角色 |
|---|---|---|
| 排列生成 | 一组数字的所有顺序组合 | 逐层选择数字并记录顺序 |
| 组合生成 | 一组数字里满足长度要求的组合 | 逐层决定是否选择元素 |
| 子集生成 | 一个集合的所有子集 | 对每个元素做选择并推进 |
| 路径探索 | 从起点到终点的可行路线 | 沿方向前进并返回上一节点 |
| 棋盘放置 | 满足位置约束的摆法 | 在每一行做选择并记录方案 |
写法模板
| 步骤 | 做法 | 说明 |
|---|---|---|
| 准备状态 | 建立初始路径、当前集合、目标结果 | 让每一步探索都有明确起点 |
| 定义选择列表 | 找出当前可推进方向 | 选择列表决定下一层能走哪些分支 |
| 加入选择 | 把当前方向加入路径或集合 | 表示已经进入该探索方向 |
| 递归前进 | 进入下一层继续探索 | 让后续选择继续展开 |
| 记录答案 | 达到目标条件时保存当前方案 | 保存一个完整结果 |
| 撤销选择 | 从路径或集合里移除当前方向 | 回到上一选择点,准备探索新方向 |
小结
回溯法的核心流程可以概括为:定义状态,列出选择,进入下一层,判断完整结果,记录答案,返回上一选择点,继续探索其他方向。它适合用于需要逐步做决定并整理所有可行方案的任务。掌握回溯法的关键是把“选择、前进、判断、记录、返回、换方向”这些动作写清楚。
【常见问题】
问题1:什么是回溯法适合用来做什么?
回答1:什么是回溯法适合用来梳理排列、组合、子集、路径选择、棋盘放置这类需要逐步做决定的任务,它能把多个可行结果系统地整理出来。
问题2:学习什么是回溯法要记住哪些核心动作?
回答2:学习什么是回溯法要记住选择、前进、判断、记录、返回、换方向。先定义当前状态,再选择可推进方向,进入下一层后继续判断并记录完整方案。
问题3:什么是回溯法和普通递归有什么关系?
回答3:什么是回溯法常用普通递归来表达。普通递归负责从当前层进入下一层,什么是回溯法在每一层做出选择,并在返回上一选择点后继续探索其他方向。
问题4:写什么是回溯法代码时怎样让流程清楚?
回答4:写什么是回溯法代码时可以把流程拆成状态准备、选择列表、进入下一层、判断完整方案、记录答案、返回上一选择点,这样什么是回溯法就能保持清晰。
问题5:什么是回溯法怎样形成完整结果?
回答5:什么是回溯法沿着选择方向逐层推进,当当前选择形成目标结果时就记录答案,再返回上一选择点继续探索其他方向,直到需要的结果被梳理完整。
免责声明:本文围绕什么是回溯法进行知识整理,内容用于学习参考,实际运行结果请以具体场景验证为准。


