前言
最近在LeetCode上刷题刷到了递归实现的回溯算法,产生疑惑:这两者有什么区别呢?在网络上阅读了一些相关的文章,总结了一些:
递归和回溯
递归:递归(recursion)是一种算法,在函数中调用自身的方法称为递归。
如果我们要构造某一个状态A,需要得到它的子状态B,构造子状态B需要B的子状态C,直到最深层的子状态N(最小子状态)被构造。
假设子状态C为最小子状态(出口),C构造成功后返回并完成子状态B的构造,B构造成功后返回并完成状态A的构造。
递归经典例子(计算阶乘):
factorial(int n) {
int m;
if (n <= 1)m = 1;
else m = n * factorial(n - 1);
return m;
}
回溯:回溯(backtrack)则是一种算法思想。
我们取第一种解释:上溯,向上推导。一个问题推导出多种可能,则选中其中一种可能继续推导。如果一条路到达尽头,则回到起点,选择另外的路径继续推导,直到所有可能被推导完毕。
(另外的路径:含有与之前推导过的路径 不同的可能 的路径)
知道深度优先搜索的同学,回溯就好像每结束深搜中的一条路线,都会返回一个这条路线上的元素所组成的序列,当所有序列被 一 一 列出,回溯结束。
算法上回溯常被用递归来实现,我把它理解成“子状态不唯一的递归”(或者是“多分支的递归”)
回溯有剪枝的功能:每次剪掉 (输出) 符合条件的树枝,当回溯结束时(若问题有序:当遇到不符合条件的树枝时停下,一种搜索过程的优化)我们就获得了所有符合条件的树枝 (答案)。
( 剪掉的部分是末端顶点到离它最近的一个有分叉的点)
回溯经典例子(8皇后问题,略)
最后
参考了CSDN博主 @繁拾简忆 的博客《回溯和递归区别》
博文原链@繁拾简忆《回溯和递归区别》
前言描述的题是力扣的 17.电话号码的字母组合,官方题解用的是哈希表和回溯,后续会更新关于我学习哈希表的内容,整理学到的知识,加油奥利干!
(有不恰当的地方,望各路大佬可以指出来)