回溯算法实际上一个相似枚举的搜索尝试过程,主要是在搜索尝试过程当中寻找问题的解,当发现已不知足求解条件时,就“回溯”返回,尝试别的路径。回溯算法说白了就是穷举法。不过回溯算法使用剪枝函数,剪去一些不可能到达 最终状态(即答案状态)的节点,从而减小状态空间树节点的生成。回溯法是一个既带有系统性又带有跳跃性的的搜索算法。它在包含问题的全部解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树。算法搜索至解空间树的任一结点时,老是先判断该结点是否确定不包含问题的解。python
几个概念要弄清楚:路径 选择列表 结束条件算法
其基本框架:框架
result = [] def backtrack(路径, 选择列表): if 知足结束条件: result.add(路径) return for 选择 in 选择列表: 作选择 backtrack(路径, 选择列表) 撤销选择
解释:首先在函数开始要写好结束条件,否则递归调用会无线递归下去。函数
为何要写for循环,通常来讲相似多叉树就用for循环,二叉树能够用两个并列的递归。指的是有不少个剩下的选择(其实就是选择列表)。而后作出一个选择以后,就是在当前节点选择其任意一个子节点。而后递归调用能够当作是把选择的该子节点当成当前节点。code
为何要撤销选择,由于当backtrace遍历到结束条件的那一层时,要返回上一层,进行另一个子节点的选择时,要撤销上次作的选择,恢复到原来的选择列表。递归
值得看的几个例子是全排列、N皇后、数独leetcode
全排列get
N皇后博客
解数独it
其中我主要是看了另一篇博客,我以为讲的很是棒。地址