返回全部文章

回溯:不是暴力乱搜,而是有约束的枚举

回溯最容易被误解成“暴力搜索”。

回溯最容易被误解成“暴力搜索”。

但真正写得稳的回溯,从来都不是乱搜,而是:

在约束条件下,有顺序地枚举可能性。

为什么回溯常让人觉得难

因为它看起来很自由:

  • 选哪个
  • 不选哪个
  • 下一层搜什么
  • 什么时候回退

如果没有明确框架,代码会很快失控。

回溯的核心问题

我更喜欢把回溯理解成三个问题:

  1. 当前状态是什么
  2. 这一层有哪些选择
  3. 什么情况下该停止

只要这三件事定义清楚,回溯就不会显得玄。

什么时候该想到回溯

常见信号包括:

  • 需要枚举所有组合、排列或方案
  • 选择之间存在层级关系
  • 可以在搜索过程中剪枝
  • 最终答案依赖完整搜索树的一部分路径

回溯为什么不是纯暴力

因为很多高质量回溯题的关键都不在“搜”,而在“剪枝”。

也就是说,真正的优化点是:

  • 哪些分支根本不值得继续
  • 哪些状态已经重复出现
  • 哪些约束可以提前判断

结论

回溯真正让人变强的地方,不是写出递归,而是学会:

如何在大量可能性里,只保留值得继续探索的分支。