【C++】递归,搜索与回溯算法入门介绍和专题一讲解

news2024/11/24 19:36:47

在这里插入图片描述
在这里插入图片描述

个人主页:🍝在肯德基吃麻辣烫
我的gitee:C++仓库
个人专栏:C++专栏

前言

从本文开始进入递归,搜索与回溯算法专题讲解。

文章目录

  • 前言
  • 一、名词解释
    • 1、什么是递归?
    • 2、为什么会用到递归?
    • 3、如何理解递归?
    • 4、如何写好递归?
  • 二、搜索vs深度优先遍历vs深度优先搜索vs宽度优先遍历vs宽度优先搜索vs暴搜
    • 1、深度优先遍历vs深度优先搜索
    • 2、宽度优先遍历vs宽度优先搜索
    • 3、关系图
    • 4. 搜索问题的拓展
  • 三、回溯与剪枝
  • 四、专题一
    • 1. 汉诺塔问题
    • 算法分析
    • 代码编写
  • 总结



一、名词解释

1、什么是递归?

递归就是函数自己调用自己。


2、为什么会用到递归?

递归的本质是:

主问题:—>相同的子问题
子问题:—>相同的子问题

3、如何理解递归?

通过:

  • 1)通过递归的细节展开图(前期可以,过了前期一定不能再用了)
  • 2)通过二叉树中的题目
  • 3)宏观看待递归问题(重要)

越往后学越发现,如果只抓住递归的细节展开图,你会发现你根本就学不好递归这个东西,递归的细节展开图只是为了辅助你读过新手期,如果你后面还在用它,那么你往往是学不好递归的。

那么:如何理解宏观看待递归问题这个点呢?

可以分为几个部分:

    • 1)不要再在意递归的细节展开图
    • 2)把递归的函数当成一个黑盒子
    • 3)相信这个黑盒子一定能完成这个任务

4、如何写好递归?

写好一个递归也分为三点:

  • 1)先找到相同的子问题(函数头的设计)
  • 2)只关心某一个子问题是如何解决的(函数体的书写)
  • 3)递归出口

二、搜索vs深度优先遍历vs深度优先搜索vs宽度优先遍历vs宽度优先搜索vs暴搜

1、深度优先遍历vs深度优先搜索

其实,一句话就能概括下来:
遍历是形式,搜索是目的。

所以,我们平时说的深度优先遍历和深度优先搜索,其实他们俩是一样的。
都可以叫做dfs

2、宽度优先遍历vs宽度优先搜索

其实,一句话就能概括下来:
遍历是形式,搜索是目的。

所以,我们平时说的宽度优先遍历和宽度优先搜索,其实他们俩是一样的。
都可以叫做bfs

3、关系图

我们所说的搜索,其实就是暴搜。
在这里插入图片描述

4. 搜索问题的拓展

我们刚开始学习搜索时,总以为dfsbfs这两个搜索都只与二叉树有关。其实不然。
从下面的例题开始你会发现,很多东西都能使用dfs进行求解。

三、回溯与剪枝

这两个名词听起来貌似很高大上,其实用一个例子就能解释清楚了。

下面来看一个迷宫问题:

在这里插入图片描述

入口和出口如上:我们从入口出发,往右边走遇到墙壁之后,往下走。走到蓝色标记,也就是拐角点的地方后,这就是一个岔路口,此时我们有两种选择:

  • 1)往左边走
  • 2)往右边走

当我们选择往左边走时,如下图:
在这里插入图片描述
会遇到墙壁,此时我们就需要原路返回

这个从某一位置出发,一条道走到黑,再沿着原路返回的过程,就叫做回溯

回溯的这条路径,我们用绿色来标记。
在这里插入图片描述
此时又走到了蓝色拐点,在这个岔路口我们有三种选择:
1)往上走
2)往左走
3)往右走

可是,我们最初是从上面下来的,然后沿着左边走,走不通之后再返回来的。
所以,我们只有一个选择:往右走。

而这个判断的过程,也就是选择路径的过程,就叫做剪枝。

将往上走的路径剪掉,将往左走的路径剪掉,就是剪枝。

四、专题一

1. 汉诺塔问题

点我直达

在这里插入图片描述

算法分析

1.找到相同的子问题:


当n = 1时:

在这里插入图片描述

直接将盘子从A柱子挪到C柱子即可。


当n = 2 时

在这里插入图片描述
分为三步走:

1)我们需要将盘子a上面的盘子借助C柱子移动到B柱子。
在这里插入图片描述

2)将a盘子移动到C柱子上
在这里插入图片描述
3)将B柱子上的所有盘子借助A盘子移动到C柱子上。

在这里插入图片描述


当n = 3 时
在这里插入图片描述

与第二步相同:
分为三步走
1)将a盘子上面的所有盘子借助C柱子移动到B柱子上。
在这里插入图片描述

2)将a盘子移动到C柱子上。
在这里插入图片描述

3)将B柱子上面的所有盘子借助A柱子移动到C柱子上。

在这里插入图片描述

2.只关心某一个子问题如何解决。

所以我们会发现,当n >= 2时,都会执行相同的子问题的操作。操作如下:

  • 1)将a盘子上面的所有盘子通过C柱子挪到B柱子上。
  • 2)将a盘子挪到C盘子上。
  • 3)将B柱子上面的所有盘子挪到C柱子上。

在这整个过程中,你要相信一件事情:
你交给dfs这个函数的任务是:

我要把所有盘子全部借助一个柱子挪到另一个柱子上。

并且要相信dfs这个函数一定能完成这个任务。

这就是宏观看待问题的思路。

3.递归出口
递归出口就是当n = 1时,你会发现跟当n = 其他数的操作步骤是不一样的。
当n = 1时,直接将a盘子移动到C柱子即可。

代码编写

class Solution {
public:
//1.重复的子问题(函数头)
//要将A柱子上面的所有盘子借助B柱子全部转移到C柱子上面

//2.只关心某一个子问题在做什么(函数体)

//3.递归出口

    void dfs(vector<int>& A, vector<int>& B, vector<int>& C,int n) 
    {
        if(n == 1)
        {
            C.push_back(A.back());
            A.pop_back();
            return;
        }

        dfs(A,C,B,n-1);
        C.push_back(A.back());
        A.pop_back();
        dfs(B,A,C,n-1);
    }
    void hanota(vector<int>& A, vector<int>& B, vector<int>& C) 
    {
        int n = A.size();
        dfs(A,B,C,n);
    }
};

总结

提示:这里对文章进行总结:

本文章详细讲解了递归,搜索与回溯算法的入门理解级操作,以及通过一道例题感受一下dfs这种算法的强大之处,关键在于dfs写起来特别简单。

学好dfs,是进入大厂的必备技能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/988540.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ARKit功能初学

文章目录 一、ARKit简介二、ARKit API 中的几个主要的类1. ARSCNView2. ARSession3. ARFrame4.ARAnchor5. ARWorldTrackingSessionConfiguration6. ARSCNViewDelegate7. ARSessionDelegate 三、ARKit示例1. 导入框架2. 设置SceneKit View3. 配置ARSCNView Session4. Camera 授权…

MyBatis数据库操作

文章目录 前言一、MyBatis的各种查询功能1.查询一个实体类对象2.查询一个List集合3.查询单个数据4.查询一条数据为map集合5.查询多条数据为map集合方法一方法二 6.测试类 二、特殊SQL的执行1.模糊查询2.批量删除3.动态设置表名5.添加功能获取自增的主键6.测试类 三、自定义映射…

CentOS 7 openssl 3.0.10 rpm包制作 —— 筑梦之路

源码下载地址&#xff1a; https://www.openssl.org/source/openssl-3.0.10.tar.gz 编写spec文件&#xff1a; cat << EOF > openssl.specSummary: OpenSSL 3.0.10 for CentosName: opensslVersion: %{?version}%{!?version:3.0.10}Release: 1%{?dist}Obsoletes…

Azure + React + ASP.NET Core 项目笔记一:项目环境搭建(一)

不重要的目录标题 前提条件第一步&#xff1a;新建文件夹第二步&#xff1a;使用VS/ VS code/cmd 打开该文件夹第三步&#xff1a;安装依赖第四步&#xff1a;试运行react第五步&#xff1a;整理项目结构 前提条件 安装dotnet core sdk 安装Node.js npm 第一步&#xff1a;新…

【最新!七麦下载量analysis参数】逆向分析与Python实现加密算法

文章目录 1. 写在前面2. 请求分析3. 加密分析4. 算法实现 1. 写在前面 之前出过一个关于榜单analysis的分析&#xff0c;有兴趣的可以查看这篇文章&#xff1a;七麦榜单analysis加密分析 最近运营团队那边有同事找到我们&#xff0c;说工作中偶尔需要统计分析一下某APP在一些主…

DOM渲染与优化 - CSS、JS、DOM解析和渲染阻塞问题

文章目录 DOM渲染面试题DOM的渲染过程DOM渲染的时机与渲染进程的概述浏览器的渲染流程1. 解析HTML生成DOM树&#xff1a;遇到<img>标签加载图片2. 解析CSS生成CSSOM(CSS Object Model): 遇见背景图片链接不加载3. 将DOM树和CSSOM树合并生成渲染树&#xff1a;加载可视节点…

【动手学深度学习】--语言模型

文章目录 语言模型1.学习语言模型2.马尔可夫模型与N元语法3.自然语言统计4.读取长序列数据4.1随机采样4.2顺序分区 语言模型 学习视频&#xff1a;语言模型【动手学深度学习v2】 官方笔记&#xff1a;语言模型和数据集 在【文本预处理】中了解了如何将文本数据映射为词元&…

ATFX汇市:美初请失业金人数21.6万人,连降四期,劳动力供需偏紧

ATFX汇市&#xff1a;9月7日&#xff0c;美国劳工部数据显示&#xff1a;美国至9月2日当周初请失业金人数最新值21.6万人&#xff0c;低于前值22.9万人&#xff08;修正前22.8万人&#xff09;&#xff0c;低于预期值23.4万人。回顾历史数据&#xff0c;美国初请失业率人数从25…

【数学建模】2023数学建模国赛C题完整思路和代码解析

C题第一问代码和求解结果已完成&#xff0c;第一问数据量有点大&#xff0c;经过编程整理出来了单品销售额的汇总数据、将附件2中的单品编码替换为分类编码&#xff0c;整理出了蔬菜各品类随着时间变化的销售量&#xff0c;并做出了这些疏菜品类的皮尔森相关系数的热力图&#…

NIFI实现JSON转SQL并插入到数据库表中

说明 本文中的NIFI是使用docker进行安装的&#xff0c;所有的配置参考&#xff1a;docker安装Apache NIFI 需求背景 现在有一个文件&#xff0c;里面存储的是一些json格式的数据&#xff0c;要求将文件中的数据存入数据库表中&#xff0c;以下是一些模拟的数据和对应的数据库…

传输层协议 --TCP报文格式详细介绍

一、 TCP协议格式 TCP如何将报头与有效载荷进行分离&#xff1f; 当TCP从底层获取到一个报文后&#xff0c;虽然TCP不知道报头的具体长度&#xff0c;但报文的前20个字节是TCP的基本报头&#xff0c;并且这20字节当中涵盖了4位的首部长度。 因此TCP是这样分离报头与有效载荷的…

Java——》ThreadLocal

推荐链接&#xff1a; 总结——》【Java】 总结——》【Mysql】 总结——》【Redis】 总结——》【Kafka】 总结——》【Spring】 总结——》【SpringBoot】 总结——》【MyBatis、MyBatis-Plus】 总结——》【Linux】 总结——》【MongoD…

ChatGPT:深度学习和机器学习的知识桥梁

目录 ChatGPT简介 ChatGPT的特点 ChatGPT的应用领域 ChatGPT的工作原理 与ChatGPT的交互 ChatGPT的优势 ChatGPT在机器学习中的应用 ChatGPT在深度学习中的应用 总结 近年来&#xff0c;随着深度学习技术的不断发展&#xff0c;自然语言处理技术也取得了显著的进步。其…

软件设计模式(二):工厂、门面、调停者和装饰器模式

前言 在这篇文章中&#xff0c;荔枝将会梳理软件设计模式中的四种&#xff1a;工厂模式、Facade模式、Mediator模式和装饰器Decorator模式。其中比较重要的就是工厂模式和装饰器模式&#xff0c;工厂模式在开发中使用的频数比较高。希望荔枝的这篇文章能讲清楚哈哈哈哈&#xf…

OpenCV(三十一):形态学操作

​​​​​​1.形态学操作 OpenCV 提供了丰富的函数来进行形态学操作&#xff0c;包括腐蚀、膨胀、开运算、闭运算等。下面介绍一些常用的 OpenCV 形态学操作函数&#xff1a; 腐蚀操作&#xff08;Erosion&#xff09;&#xff1a; erode(src, dst, kernel, anchor, iteration…

【LeetCode】剑指 Offer <二刷>(6)

目录 题目&#xff1a;剑指 Offer 12. 矩阵中的路径 - 力扣&#xff08;LeetCode&#xff09; 题目的接口&#xff1a; 解题思路&#xff1a; 代码&#xff1a; 过啦&#xff01;&#xff01;&#xff01; 题目&#xff1a;剑指 Offer 13. 机器人的运动范围 - 力扣&#…

docker-compose安装mysql

基于docker-compose快速安装mysql 目录 一、目录结构 1、 docker-compose.yml 2、 my.cnf 3、error.log 二、执行安装 三、连接使用 一、目录结构 1、 docker-compose.yml version: 3 services:mysql:image: registry.cn-hangzhou.aliyuncs.com/zhengqing/mysql:5.7 #…

Kubernetes核心概念

Kubernetes是一个工业级的容器编排平台。 Kubernetes核心功能 服务发现和负载均衡。容器的自动装箱&#xff0c;调度&#xff08;scheduling&#xff09;&#xff0c;按照容器的规格&#xff08;需要的cpu和内存等&#xff09;确定一个容器存放到集群中的哪一个机器上。进行自…

创建vue3项目并引用elementui

1.创建vu3项目&#xff1a; 执行命令 npm create vuelatest 2.终端会出现如下选项&#xff0c;不确定的直接enter键进入下一步&#xff1b; 3.然后再执行下方命令&#xff1a; cd <your-project-name> npm install4.安装依赖成功后引入elementui,执行命令&#xff1a…

高压电容器的内部结构是什么样的?

高压电容器的内部结构取决于其具体的设计和用途&#xff0c;但通常包括以下主要组件&#xff1a; 电介质&#xff1a;电介质是高压电容器内部的核心部分。它通常由绝缘材料制成&#xff0c;如聚丙烯薄膜、聚酯薄膜、陶瓷或其他高绝缘性材料。电介质的选择取决于电容器的电压等级…