回溯和递归的区别(简述)

回溯和递归的区别(简述)

前言

最近在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.电话号码的字母组合,官方题解用的是哈希表和回溯,后续会更新关于我学习哈希表的内容,整理学到的知识,加油奥利干!
(有不恰当的地方,望各路大佬可以指出来)

  • 14
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

莉妮可丝的猫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值