回溯算法實際上一個相似枚舉的搜索嘗試過程,主要是在搜索嘗試過程當中尋找問題的解,當發現已不知足求解條件時,就「回溯」返回,嘗試別的路徑。回溯算法說白了就是窮舉法。不過回溯算法使用剪枝函數,剪去一些不可能到達 最終狀態(即答案狀態)的節點,從而減小狀態空間樹節點的生成。回溯法是一個既帶有系統性又帶有跳躍性的的搜索算法。它在包含問題的全部解的解空間樹中,按照深度優先的策略,從根結點出發搜索解空間樹。算法搜索至解空間樹的任一結點時,老是先判斷該結點是否確定不包含問題的解。python
幾個概念要弄清楚:路徑 選擇列表 結束條件算法
其基本框架:框架
result = [] def backtrack(路徑, 選擇列表): if 知足結束條件: result.add(路徑) return for 選擇 in 選擇列表: 作選擇 backtrack(路徑, 選擇列表) 撤銷選擇
解釋:首先在函數開始要寫好結束條件,否則遞歸調用會無線遞歸下去。函數
爲何要寫for循環,通常來講相似多叉樹就用for循環,二叉樹能夠用兩個並列的遞歸。指的是有不少個剩下的選擇(其實就是選擇列表)。而後作出一個選擇以後,就是在當前節點選擇其任意一個子節點。而後遞歸調用能夠當作是把選擇的該子節點當成當前節點。code
爲何要撤銷選擇,由於當backtrace遍歷到結束條件的那一層時,要返回上一層,進行另一個子節點的選擇時,要撤銷上次作的選擇,恢復到原來的選擇列表。遞歸
值得看的幾個例子是全排列、N皇后、數獨leetcode
全排列get
N皇后博客
解數獨it
其中我主要是看了另一篇博客,我以爲講的很是棒。地址