“深度”的理解
深度优先的关键,在于深度,一扎到底,有一种“不撞南墙,死都不回头”的勇猛。
理解深度优先搜索的关键,也就在深度上。
一般理解深度优先搜索会用迷宫举例子,其实这个例子本身就很形象具体了,可以很好理解,但是如果不抓住理解的本质,很容易就会犯难。
分叉、分叉、分叉
深度优先的搜索选择,在于执迷不悟地每次只选同一方向的分叉,直到撞死在南墙上,才想到要回到上一个分叉,另作选择。
所以,这种很有次序的选择,用递归就很好实现,比如:
void DFS(int n, int x) {
if (n == 10) return;
DFS(n+1, choice 1);
DFS(n+1, choice 2);
}
循着递归深下去,会先一直1、1、1、1……然后碰到南墙回到上一个1然后2……
注意,这里是有边界的,所以上面的2(如果视为最后一个),那么再递归时就会返回,这里特别适合动手画一个图来辅助理解
递归的关键
要有计数!要有底!
也就是迟早会“迷途知”,然后再不断尝试,最终得出结果。