遞迴:就是出現這種情況的**: (或者說是用到了棧)
解答樹角度:在dfs遍歷一棵解答樹
優點:結構簡潔
缺點:效率低,可能棧溢位
遞迴的一般結構:
1void
f() 67
//某種形式的呼叫
8f();
9 }
回溯:遞迴的一種,或者說是通過遞迴這種**結構來實現回溯這個目的。回溯法可以被認為是乙個有過剪枝的dfs過程。
解答樹角度:帶回溯的dfs遍歷一棵解答樹
回溯的一般結構:
1void dfs(int
當前狀態)
6for(i=0;i//
橫向遍歷解答樹所有子節點7//
擴充套件出乙個子狀態。
8修改了全域性變數9if
(子狀態滿足約束條件)
12 恢復全域性變數//
回溯部分13}
14 }
bfs和dfs是相似。
bfs(顯式用佇列)
dfs(隱式用棧)(即遞迴)
當然,對於dfs,用遞迴可能會造成棧溢位,所以也可以更改為顯示棧。
1void bfs(node &head)
13 }
reference:
遞迴,回溯,DFS,BFS的理解和模板
leetcode 裡面很大一部分題目都是屬於這個範圍,例如path sum用的就是遞迴 dfs,path sum2用的是遞迴 dfs 回溯 遞迴 就是出現這種情況的 或者說是用到了棧 解答樹角度 在dfs遍歷一棵解答樹 優點 結構簡潔 缺點 效率低,可能棧溢位 遞迴的一般結構 voidf 某種形式的...
遞迴,回溯和DFS區別
遞迴是一種演算法結構,回溯是一種演算法思想 乙個遞迴就是在函式中呼叫函式本身來解決問題 回溯就是通過不同的嘗試來生成問題的解,有點類似於窮舉,但是和窮舉不同的是回溯會 剪枝 意思就是對已經知道錯誤的結果沒必要再列舉接下來的答案了,比如乙個有序數列1,2,3,4,5,我要找和為5的所有集合,從前往後搜...
遞迴 回溯和DFS的區別
剪枝的意思也就是說對已經知道錯誤的結果沒必要再列舉接下來的答案了,比如乙個有序數列1,2,3,4,5,我要找和為5的所有集合,從前往後搜尋我選了1,然後2,然後選3的時候發現和已經大於預期,那麼4,5肯定也不行,這就是一種對搜尋過程的優化。回溯搜尋是深度優先搜尋 dfs 的一種。對於某乙個搜尋樹來說...