“骗分过样例,暴力出奇迹。爆搜挂着机,打表出省一。” ——只有OIer才能看懂的梗。
今天要讲的就是“爆搜挂着机”里的爆搜——DFS算法。
概述: DFS 是一种递归的搜索算法,其本质是通过递归地深入到问题的解空间中,直到找到目标解或无法继续深入为止。递归本身使用了函数调用栈来跟踪函数的执行和返回。
对于新手,了解递归和爆搜前,磨刀不误砍柴功,先了解其使用的数据结构,也就是栈。
栈
栈是一种有记忆功能的数据结构。
记忆功能的实现在于栈会存储每一次入栈。存储特点是先进后出,就像一个箱子,最先拿出来的是放在最上面的东西,压箱底的是最后拿出来的。
入栈图示:
出栈图示:
有了这个概念后,我们看递归。
递归
递归将问题分解为无数个小问题,由于这个特性,在分治,回溯,DP算法中都有应用。
首先明确一点:递归不是循环!
往往循环到达 break
的条件时,循环就已经结束了,但当递归当前状态到达符合 return
的条件时,递归才刚刚开始。
void list(int s) {
if(s > n) {
printf("到达return条件。\n");
return;
}
printf("%d\n", s);
list(s + 1);
printf("%d\n", s)