算法-----递归~~搜索~~回溯(宏观认识)

news2024/11/25 16:37:36

目录

1.什么是递归

1.1二叉树的遍历

1.2快速排序

1.3归并排序

2.为什么会用到递归

3.如何理解递归

4.如何写好一个递归

5.什么是搜索

5.1深度(dfs)优先遍历&优先搜索

5.2宽度(bfs)优先遍历&优先搜索

6.回溯


1.什么是递归

我们呢下面介绍一下递归的几个使用的场景,这个里面不会介绍像这个斐波那契数列那样的递归(就是数学函数,很容易理解),我们就拿数据结构里面的排序算法和二叉树的遍历作为例子熟悉一下这个过程

1.1二叉树的遍历

我们这个地方是以后序遍历作为例子。对于一个二叉树而言,这个后序遍历的时候我们先遍历根节点的左子树,再去遍历根节点的右子树。最后遍历这个根节点;

在遍历左子树的时候,我们要先遍历这个左子树的根节点的左子树,再去遍历这个左子树根节点的右子树,以此类推,对于任何一个子树,我们都会先遍历这个根节点的左子树,再去遍历这个根节点的右子树;

1.2快速排序

快速排序和下面介绍的这个归并排序对于初学者而言很相似(我就是这个感觉),但是两个排序算法还是有很多的差异的;

快速排序之所以敢这么叫这个名字,自身的这个时间消耗上面肯定是可以的,它是有使用价值的,并不想其他的一些排序算法只有教学意义,没有实践意义;

快排需要先确定一个基准元素,把小于这个元素的放到左边,大于这个元素的放到右边,分别对于这个左边的和右边的进行排序,还是选择基准元素,按照上面的方法进行下去;

1.3归并排序

归并排序就和上面的快速排序有点不同了,因为归并排序是直接从中间分开,然后再把这个自己左右分开,直到分成一个一个的元素,最后把这个元素有序的组合起来即可;

下面的这个就是归并排序的过程展示:就是分开之后合并的过程,这个合并的时候我们是使用的双指针的方法合并的(通过指针的移动);

2.为什么会用到递归

我们在解决一个问题的时候,把这个问题分解为诸多的子问题,可以使用一个方法解决这个主问题,但是解决子问题的时候同样可以使用这个方法解决;

3.如何理解递归

3.1递归展开细节图:这个是初学的时候,老师经常搞的一种方法,但是这个并不一定会简化我们对于这个递归问题的理解;

3.2二叉树的题目:我们在二叉树学习的时候,尤其是涉及到这个二叉树的遍历,因为二叉树的遍历里面遍历任何一个子树的方法都是一样的,他们都是若干个子问题,我们就可以直接使用递归解决这个问题;

3.3宏观看待递归过程:我们跳出上面的递归细节展开图,找准子问题,只需要关注一个问题的实现,再去套用这个方法解决其他的问题;

下面我们按照这个思路简单的写一下dfs(深度遍历)和归并的伪代码:

我们没有实现,但是我们先把这个root->left作为函数的参数,root->right作为函数的参数,最后判断这个结束条件(到达叶子结点就结束);

void dfs(treenode* root)
{
	//结束条件:遇到叶子结点
	if (root == NULL)
	{
		return;
	}
	dfs(root->left);
	dfs(root->right);
	printf("%d", root->val);
}

我们先计算这个mid值大小,再把这个mid作为参数传递进去,分别传递这个左边区间,和右边区间,使用这个函数进行排序,最后合并两个有序数组,结束条件就是left>=right,结束递归的过程;

void merge(int* nums, int left, int right)
{
	//递归结束的出口
	if (left >= right)
	{
		return;
	}
	int mid = (left + right) / 2;
	merge(nums, left, mid);
	merge(nums, mid + 1,right);
	//合并两个有序数组
}

4.如何写好一个递归

4.1函数头的书写:找到一个主问题里面的字问题,看看是否可以使用相同的方法解决子问题;

4.2函数体的书写:只关注某一个子问题,来进行函数体的实现;

4.3结束条件:找这个递归的出口,作为结束递归的条件;

5.什么是搜索

5.1深度(dfs)优先遍历&优先搜索

深度就是一条路走到尽头之后再去折返回去,这个里面遍历只是过程的一种形式,搜索才是真正想要达到的目的;

5.2宽度(bfs)优先遍历&优先搜索

宽度就是你一层一层的进行,按照这个二叉树的层状结构进行遍历,这一层结束之后进行下一层;

6.回溯

回溯就是深度搜索,我们可以举例一下这个走迷宫的问题帮助我们理解一下,当我们走到一个迷宫的某一个节点的时候,我们有多个选择,我们肯定是只能走其中的一条,这个时候,我们认准一条路并且总下去,这个时候,我们发现走到了死胡同,这个时候我们就需要则返回那个岔路口,这个从现在所在位置返回到刚刚做选择的岔路口就是一个回溯的过程,因此我们说这个回溯和深度搜索没有什么本质的区别,都是一条路走到黑再去选择另外的一条路,仅此而已。

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

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

相关文章

微信小游戏之 三消(一)

首先设定一下 单个 方块 cell 类: 类定义和属性 init 方法 用于初始化方块,接收游戏实例、数据、宽度、道具类型和位置。 onWarning 方法 设置警告精灵的帧,并播放闪烁动作,用于显示方块的警告状态。 grow 方法 根据传入的方向…

【科研技巧】如何查找一个人发表的所有文章

使用此网站 点击作者检索 点击作者名字 可以看到全部文章

SpringBoot运行流程源码分析

run方法核心流程 我们在启动SpringBoot的时候调用的是SpringApplication类的静态run方法。其核心流程如下图所示: 在run方法内完成了SpringApplication的声明周期。,这个过程涉及的几个核心类如下: SpringApplicationRunListeners&#xff…

【C++】:红黑树的应用 --- 封装map和set

点击跳转至文章:【C】:红黑树深度剖析 — 手撕红黑树! 目录 前言一,红黑树的改造1. 红黑树的主体框架2. 对红黑树节点结构的改造3. 红黑树的迭代器3.1 迭代器类3.2 Begin() 和 End() 四,红黑树相关接口的改造4.1 Find…

Qt基础 | 自定义界面组件 | 提升法 | 为UI设计器设计自定义界面组件的Widget插件 | MSVC2019编译器中文乱码问题

文章目录 一、自定义 Widget 组件1.自定义 Widget 子类2.自定义 Widget 组件的使用 二、自定义 Qt Designer 插件1.创建 Qt Designer Widget 插件项目2.插件项目各文件的功能实现3.插件的编译与安装4.使用自定义插件5.使用 MSVC 编译器输出中文的问题 一、自定义 Widget 组件 当…

【React】详解受控表单绑定

文章目录 一、受控组件的基本概念1. 什么是受控组件?2. 受控组件的优势3. 基本示例导入和初始化定义函数组件处理输入变化处理表单提交渲染表单导出组件 二、受控组件的进阶用法1. 多个输入框的处理使用多个状态变量使用一个对象管理状态 2. 处理选择框(…

leetcode-104. 二叉树的最大深度

题目描述 给定一个二叉树 root ,返回其最大深度。 二叉树的 最大深度 是指从根节点到最远叶子节点的最长路径上的节点数。 示例 1: 输入:root [3,9,20,null,null,15,7] 输出:3示例 2: 输入:root [1,n…

24款美规奔驰GLS450更换中规高配主机系统,提升车辆功能和使用体验

平行进口奔驰GLS450 语音小助手要说英语 十分的麻烦 而且也没有导航,原厂记录仪也减少了 很不方便 那要怎么解决呢 往下看 其实很简单,我们只需要更换一台中规的新主机就可以实现以下功能: ①中国地图 ②语音小助手(你好&#…

C++编译jsoncpp库

下载https://github.com/hailong0715/jsoncpp/tree/master windows编译工程 jsoncpp-master\makefiles\vs71 1.msvcprtd.lib(MSVCP140D.dll) : error LNK2005 解决办法: (1).工程(Project)->属性(Properties)->配置属性(Configuration Properties)->c/c-…

OZON打开哈萨克斯坦市场,OZON测试开通哈萨克斯坦市场中国产品

在全球化日益深入的今天,跨境电商成为了连接不同国家和地区消费者的重要桥梁。2024年7月26日,Ozon Global宣布了一项重大扩展计划,正式将中国卖家的销售版图拓展至哈萨克斯坦市场,为中国企业打开了新的增长机遇之门。 OZON哈萨克斯…

2024AGI面试官 常问的问题以及答案(附最新的AI大模型算法面试大厂必考100题 )

前言 在这个人工智能飞速发展的时代,AI大模型已经成为各行各业创新与变革的重要驱动力。从自动驾驶、医疗诊断到金融分析,AI大模型的应用场景日益广泛,为我们的生活带来了前所未有的便捷。作为一名程序员,了解并掌握AI大模型的相…

移植QT项目出现无法找到 v143 的生成工具(平台工具集 =“v143”)。若要使用 v143 生成工具进行生成,请安装 v143 生成工具。

由于使用的是visual studio2019,在扩展里没找到msvc v143的工具集,这时候可能需要升级下版本,比如换用visual studio2022 或者在三个地方更改所使用的工具集,一般来讲只要v143编译能通过的v142编译也能通过,所以换用v…

ctfshow-web入门-php特性(web147-web150_plus)

目录 1、web147 2、web148 3、web149 4、web150 5、web150_plus 1、web147 ^:匹配字符串的开头。 $:匹配字符串的结尾,确保整个字符串符合规则。 [a-z0-9_]:表示允许小写字母、数字和下划线。 *:匹配零个或多个前面…

c++入门----类与对象(中)

OK呀,家人们承接上文,当大家看过鄙人的上一篇博客后,我相信大家对我们的c已经有一点印象了。那么我们现在趁热打铁再深入的学习c入门的一些知识。 类的默认成员函数 首先我们学习的是我们的默认函数。不知道大家刚读这个名词是什么反应。默认…

一下午连续故障两次,谁把我们接口堵死了?!

唉。。。 大家好,我是程序员鱼皮。又来跟着鱼皮学习线上事故的处理经验了喔! 事故现场 周一下午,我们的 编程导航网站 连续出现了两次故障,每次持续半小时左右,现象是用户无法正常加载网站,一直转圈圈。 …

2020 CSP第一题:数字拆分

2020 CSP第一题:数字拆分 示例1 输入 6 输出 4 2 题意: 实质就是将一个偶数转化为二进制数,然后分别用十进制逆序输出每一项 数据约束: n最大在10的七次方左右,int类型够了,十进制转化为二进制后&#x…

重生之“我打数据结构,真的假的?”--3.栈和队列

1.栈和队列的基本概念 1.1 栈 栈:一种特殊的线性表,其只允许在固定的一端进行插入和删除元素操作。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO(Last In First Out)的原则…

鸿蒙开发——axios封装请求、拦截器

描述:接口用的是PHP,框架TP5 源码地址 链接:https://pan.quark.cn/s/a610610ca406 提取码:rbYX 请求登录 HttpUtil HttpApi 使用方法

开源模型应用落地-LangChain实用小技巧-ChatPromptTemplate的partial方法(一)

一、前言 在当今的自然语言处理领域,LangChain 框架因其强大的功能和灵活性而备受关注。掌握一些实用的小技巧,能够让您在使用 LangChain 框架时更加得心应手,从而更高效地开发出优质的自然语言处理应用。 二、术语 2.1.LangChain 是一个全方…

TCP/IP协议(全的一b)应用层,数据链层,传输层,网络层,以及面试题

目录 TCP/IP协议介绍 协议是什么,有什么作用? 网络协议为什么要分层 TCP/IP五层网络协议每层的作用 应⽤层 DNS的作用及原理 DNS工作流程 数据链路层 以太⽹帧格式 MAC地址的作用 ARP协议的作⽤ ARP协议的工作流程 MTU以及MTU对 IP / UD / TCP 协议的影响 传输层…