回溯:不是暴力乱搜,而是有约束的枚举
回溯最容易被误解成“暴力搜索”。
回溯最容易被误解成“暴力搜索”。
但真正写得稳的回溯,从来都不是乱搜,而是:
在约束条件下,有顺序地枚举可能性。
为什么回溯常让人觉得难
因为它看起来很自由:
- 选哪个
- 不选哪个
- 下一层搜什么
- 什么时候回退
如果没有明确框架,代码会很快失控。
回溯的核心问题
我更喜欢把回溯理解成三个问题:
- 当前状态是什么
- 这一层有哪些选择
- 什么情况下该停止
只要这三件事定义清楚,回溯就不会显得玄。
什么时候该想到回溯
常见信号包括:
- 需要枚举所有组合、排列或方案
- 选择之间存在层级关系
- 可以在搜索过程中剪枝
- 最终答案依赖完整搜索树的一部分路径
回溯为什么不是纯暴力
因为很多高质量回溯题的关键都不在“搜”,而在“剪枝”。
也就是说,真正的优化点是:
- 哪些分支根本不值得继续
- 哪些状态已经重复出现
- 哪些约束可以提前判断
结论
回溯真正让人变强的地方,不是写出递归,而是学会:
如何在大量可能性里,只保留值得继续探索的分支。