定义

递归

简单地说,就是如果在函数中存在着调用函数本身的情况,这种现象就叫递归。
进一步剖析「递归」,先有「递」再有「归」,「递」的意思是将问题拆解成子问题来解决, 子问题再拆解成子子问题,…,直到被拆解的子问题无需再拆分成更细的子问题(即可以求解),「归」是说最小的子问题解决了,那么它的上一层子问题也就解决了,上一层的子问题解决了,上上层子问题自然也就解决了,….,直到最开始的问题解决,文字说可能有点抽象,那我们就以阶层 f(6) 为例来看下它的「递」和「归」。
image.png

深度优先搜索

这个详见本博客图论中图的两种遍历

回溯

回溯是一种算法思想,可以用递归实现。

穷举

顾名思义,穷举就是列出所有可能的情况。

区别

  • 递归是一种算法结构,而回溯和深度优先搜索是一种算法思想。
  • 从解空间树的角度看,深度优先搜索会访问解空间树的所有节点,并标记“走过的路”(比如背包问题)不可撤销这种标记,一条路走到黑,直到找到问题的解;而回溯是一种试探性地行为,也会标记,但是可撤销此标记。
  • 回溯和深度优先搜索最大的区别是,回溯一定伴随着‘剪枝’操作,节省大量时间,深度优先搜索却不一定。

    联系

  • 回溯和深度优先搜索,都会利用递归实现。

  • 回溯是深度优先搜索实现的一种形式,但是深度优先搜索不剪枝。

大白话

什么是递归,就是一种以函数本身自己调用自己,最终达到求解的方式(递归都不知道是什么的,去看看509 fibonacci-number 斐波那契数列)。然后深度优先搜索呢是一种借助递归以达到遍历整个图的一种方式,回溯就是在递归/深度优先搜索的基础上做一些记忆缓存,达到剪枝的操作。
那穷举是什么呢,上面三个都是从根节点开始,一直找到初始节点。穷举就是从初始节点开始,不具任何特殊性,走遍所以能够走的节点,列举出所有情况,以找到符合情况的根节点。