要理解深度優先搜索必須理解遞歸的本質,遞歸的核心思想在於在一個函數尚未執行完成的時候就調用自身,這樣就會造成一個樹狀的結構,從而使其能夠一直延伸下去,進而覆蓋全部可能的分支。直到某一層遞歸條件知足,纔開始收斂。算法
Figure 1 遞歸函數
Note:圖中序號相同並且用虛線相鏈接的一個方塊和圓圈對錶示一次函數調用blog
從圖中能夠看出遞歸具備很強的可回退性和選擇性,圖中的2和2’是一次遞歸的不一樣分支,3和3’是一次遞歸的不一樣分支。函數執行到某一層次以後徹底能夠選擇任何一個分支進行收斂,這點恰好符合深度優先搜索的需求。遞歸
寬度優先搜索算法,其本質則是基於樹狀結構,每到一層,先把該層全部的未遍歷的節點添加到隊列,再判斷每個節點是否知足條件,若是知足退出便可,不然,再到下一層繼續遍歷。隊列
在遍歷的過程當中每一層的遍歷都在上一層遍歷的後面,這一點正是隊列的特色——先把一個節點對應的下一層可達的節點所有添加到隊列尾,繼續遍歷上一層的隊列,上一層結束後遍歷下一層的節點。內存
這兩種搜索算法都可以生成全部可以遍歷到的狀態,於是在須要對全部狀態進行處理時使用寬度優先搜索算法時是能夠的。可是使用遞歸函數則實現比較簡單一點,並且狀態的管理也更簡單。故而通常仍是使用深度優先搜索算法實現。可是在求最短路徑的時候通常仍是使用寬度優先搜索算法。搜索
寬度優先搜索算法通常會把狀態逐個添加到隊列中,也就是說內存與狀態數成正比,而深度優先搜索算法則是與最大遞歸數成正比,因此通常認爲深度優先搜索算法更爲節省內存。遍歷