# 在开始之前
⚡ 30 秒速记
- 回溯处理的是“从多个候选中做选择、继续探索、失败后撤销”的搜索问题,递归只是承载搜索树的一种方式
- 开始前先写清状态、候选集合、终止条件和约束,四者缺一就容易漏解或重复
- 结果要求所有方案时不能命中一个就结束;只求任一方案时才适合逐层短路
递归与回溯并不是什么玄学,但对初学者来说也确实需要一个逐步理解和练习的过程。 一看到“思想”就先认定自己学不会,往往会在真正接触问题前放大难度,反而错过理解它的机会。算法学习本身不是轻松的挑战,尤其不少前端同学平时接触得不多,更需要耐心读下去。先别急着追求一次掌握,愿意继续看具体问题和解法,才有机会把抽象概念变成能使用的方法。
根据我深耕技术写作多年的经验,很多同学一看到标题里有“思想”两个字,就会觉得接下来要讲的一定是一个非常复杂的“高大上”理论,于是他会先给自己箍上一个“我一定学不会”的紧箍咒,接着心里就开始打退堂鼓了。这样的同学在和算法正面交锋之前,就先被自己内心的恐惧击垮了,实在可惜。
站在讲解者的角度来说,我确实不会先给大家画个饼,说这玩意儿有多么多么简单——这是一个非常不负责任的承诺。因为对于初学者来说,没有什么是简单的,从不会到会本来就是一个过程。况且,你现在学的是不少前端er都不肯学/学不动的算法,这本就不是一个轻松的挑战。但既然走到了这一步,不管你这会儿心里有多慌,我都希望你可以坚持一下、读读看,你会发现这玩意儿真的不是玄学——它真的很香。
💬 面试官追问
-
候选人在全排列页面一看到“递归思想”就先背定义,却无法解释
path为什么会变化,你会怎样判断他的主要障碍?主要障碍不是术语记得少,而是尚未把抽象概念映射到一次具体执行过程。应让他手推少量元素的调用与返回,观察每层做了什么选择;如果仍只复述定义,就说明还没有形成可执行的理解。
-
团队新人面对递归代码时坚持先读完整套理论再动手,结果两天后仍写不出最小示例,你会怎样调整学习任务?
我会把任务缩成一道输入很小、分支清晰的题,让他先写出能运行的搜索过程,再根据代码补充递归与回溯术语。这样能用具体行为承载抽象思想,但不能省略后续复盘,否则容易只记住单题写法。
-
面试只剩二十分钟,候选人对回溯很紧张,是继续追问完整理论,还是让他从一个两元素排列开始写?
应先让他从两元素排列开始,借助明确的选择与返回过程展示真实理解,而不是考察术语背诵。若最小规模能够写通,再逐步增加约束;若基础递归终止条件仍不清楚,继续扩题只会放大无效试错。
-
候选人在白板上说“算法思想太玄学,所以只能背模板”,但换一道题就不会了,你会如何定位并纠正?
我会要求他画出题目的选择过程,并说明每层有哪些候选、何时结束以及返回后状态如何变化。模板只能压缩已经理解的套路,不能替代决策过程;若无法解释每行代码对应的选择,就应退回具体样例重新推演。
# 如何学好这一节
⚡ 30 秒速记
- 不要背最终代码,先手动画前两层选择树,标出每层可选范围和哪些分支应剪掉
- 模板中的路径、起始下标、visited、剩余目标各解决不同的“是否可重复选择”约束
- 用最小输入做逐帧跟踪,再用空输入、重复元素和无解输入验证边界
学这一节不要死背概念和最终代码,要通过具体题目理解递归与回溯的重复套路。 面试更关心能不能把题做出来,所以遇到穷举问题时,可以先画出前几层搜索树,找清每层重复执行的选择动作和停止条件。简单来说,先用全排列、组合这类题建立树形思维,再把抽象思想对应到具体代码。刚开始没联想到递归很正常,关键是多做同类题,逐渐形成看到重复逻辑就考虑递归和 DFS 的习惯。