回溯法的小结与概述

本文主要讲解回溯法的要点与细节,按照步骤思考更方便理解

提供通用回溯法的伪代码,末尾

说到回溯算法,其实是和递归密不可分的,只要有回溯,就会有递归


什么是回溯呢?

简单来说:就是回到上一个状态(回到之前状态)

为什么要回到上一个状态呢(仔细看这里)?

因为在一些题目中,当前状态是基于上一个状态构建的(是上一个状态的子集),上一个状态还有别的子集没有遍历到。所以,要返回(回溯)到上一个状态,方便枚举隶属于上个状态的其他子集。


讲到这里,其实就可以明白什么是回溯,为什么要进行回溯了。但是什么时候使用回溯呢,我们举几个例子:

  • 组合问题:{1,2,3,4} 中找出大小为2的组合(不强调顺序)
  • 排列问题:{1,2,3,4} 按照升序的全排列,有多少排列方式(强调顺序)
  • 切割问题:字符串按照一定规则有几种切割方式
  • 子集问题:一个集合中有多少符合条件的子集
  • 棋盘问题:N皇后,解数独

回溯算法是类似于数的结构,我们在解题时可以把一个个元素想象成数的节点

由于回溯的本质就是找到给定集合的子集,所以给定的集合就构成了数的宽度,而递归则是树的深度(类比一下二叉树), 所以回溯算法代码的组成就是for循环+递归

for循环就是遍历每层集合区间,可以理解一个节点有多少个孩子,这个for循环就执行多少次。

backtracking这里自己调用自己,实现递归。

横向for循环------------------------------------------------------------------------>>

纵向 {1, 2, 3, 4}

递归 {2,3,4} || {3,4} || {4} || { }

| {3,4} | {4} | { } || 。。。|| 。。 ||。。。

|

|

V //模拟组合问题

下面是回溯的代码模板

复制代码
void backtracking(参数) {
    if (终止条件) {   //符合我们的结果收集规则时,就存放
        存放结果;
        return;
    }

    for (选择:本层集合中元素(树中节点孩子的数量就是集合的大小)) {
        处理节点;
        backtracking(路径,选择列表); // 递归
        回溯操作,撤销处理结果; //返回上一个节点(上一个状态)
    }
}
相关推荐
独好紫罗兰几秒前
对python的再认识-基于数据结构进行-a004-列表-实用事务
开发语言·数据结构·python
ZH15455891313 分钟前
Flutter for OpenHarmony Python学习助手实战:模块与包管理的实现
python·学习·flutter
不穿格子的程序员3 分钟前
从零开始刷算法——贪心篇1:跳跃游戏1 + 跳跃游戏2
算法·游戏·贪心
大江东去浪淘尽千古风流人物5 分钟前
【SLAM新范式】几何主导=》几何+学习+语义+高效表示的融合
深度学习·算法·slam
山岚的运维笔记6 分钟前
SQL Server笔记 -- 第20章:TRY/CATCH
java·数据库·笔记·sql·microsoft·sqlserver
choke23312 分钟前
[特殊字符] Python异常处理
开发语言·python
铉铉这波能秀13 分钟前
LeetCode Hot100数据结构背景知识之列表(List)Python2026新版
数据结构·leetcode·list
重生之我是Java开发战士19 分钟前
【优选算法】模拟算法:替换所有的问号,提莫攻击,N字形变换,外观数列,数青蛙
算法
仟濹25 分钟前
算法打卡 day1 (2026-02-06 周四) | 算法: DFS | 1_卡码网98 可达路径 | 2_力扣797_所有可能的路径
算法·leetcode·深度优先
yang)25 分钟前
欠采样时的相位倒置问题
算法