递归是表达自然、但不一定最优的。是否使用分治,取决于两个问题:
- 问题是否可按同构子问题拆解;
- 子问题之间是否独立,能否高效合并。
与迭代的关系
很多递归都可改写为迭代,但会更复杂。 当递归层级浅、状态转换复杂,迭代通常更稳;当问题天然自相似,递归更清晰。
与动态规划的关系
当子问题重叠严重(斐波那契朴素递归典型)时,分治 + 缓存(记忆化)或 DP 更合适。 分治偏“只做一次”,DP 偏“做多次并复用”。
与回溯的关系
回溯遍历的是“可行解空间树”,并常伴随剪枝; 分治关注的是“问题结构树”,目标是规模缩小+合并重构。 两者都可用递归实现,但状态解释不同。
本章的 13 个编程 Lab 刻意不包含全排列、组合枚举和子集生成:这些题的核心是遍历选择空间并撤销选择,应该放在回溯专题中,而不是仅因为“代码用了递归”就归入分治。
决策小框架
- 有无重叠子问题?有则先考虑记忆化/DP;
- 是否必须搜索全部选择?是则考虑回溯;
- 是否能独立切块并高效合并?是则优先分治;
- 数据规模下栈深度是否可控?不可控则尽量改迭代。
本章小结
递归只是破局的工具,而非教条。
在面对考试或工业界真实的算法挑战时,你可以用分治写出极具表现力的初始解法,也可以在性能遭遇瓶颈的关键路径上将其替换为 DP 或是迭代。
一名成熟的开发者,应当能在思维的自然表达与机器的极致执行之间游刃有余地切换。关键并不在于你用了哪种语法,而在于算法的正确性与时空代价始终都在你的证明与掌控之中。