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

目录

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.xdnf.cn/news/1489254.html

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

相关文章

GD 32 流水灯

前言: 通过后面的学习掌握了一些逻辑架构的知识,通过复习的方式将学到的裸机任务架构的知识运用起来,同时巩固前面学到的知识,GPIO的配置等。 开发板上LED引脚使用示意图 注:此次LED灯的点亮凡是是高电平点亮&#xff…

计科录取75人!常州大学计算机考研考情分析!

常州大学(Changzhou University),简称“常大”,位于江苏省常州市,是江苏省人民政府与中国石油天然气集团有限公司、中国石油化工集团有限公司及中国海洋石油集团有限公司共建的省属全日制本科院校,为全国深…

AIoTedge边缘物联网平台,开启智能物联新架构

边缘物联网平台是一种将计算能力、数据处理和应用服务部署在网络边缘的解决方案,旨在提高响应速度、降低带宽需求和增强数据安全。根据搜索结果,边缘物联网平台应具备以下功能: 云边协同: 云边一体架构,通过云端管理边…

PHP家政系统自营+多商户独立端口系统源码小程序

家政行业的新篇章 引言:家政行业的数字化转型 近年来,随着科技的飞速发展和人们生活节奏的加快,家政服务行业也迎来了数字化转型的浪潮。为了提升服务效率、优化用户体验,越来越多的家政公司开始探索“家政系统自营多商户小程序…

Tomcat中的WebSocket是如何实现的?

Tomcat中的WebSocket是如何实现的? WebSocket是一种在客户端和服务器之间提供长期、双向、实时通信的协议 全双工通信:WebSocket允许数据同时在客户端和服务器双向通信,无需像HTTP等待请求和响应的循环 单个TCP连接:建立一次连…

解答|需要通过等保测评、密评的SSL证书应考虑哪些因素?

随着数字化转型的深入,网络安全成为了企业发展的基石。在中国,网络安全等级保护制度(简称“等保”)和密码安全性评估(简称“密评”)是确保信息系统安全的重要标准。在这一背景下,选择SSL证书时需…

html+css 实现悬浮按钮

前言:哈喽,大家好,今天给大家分享htmlcss 绚丽效果!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 文…

F4A0手把手教程1: 华大单片机HC32F4A0如何新建工程(ddl库版本)

开发板请点击:https://item.taobao.com/item.htm?spma21n57.1.item.3.5fc760c3ycChCu&priceTId2150418a17219238749041878ec06d&utparam%7B%22aplus_abtest%22:%222166044947a45798ae4c3d102fcea719%22%7D&id707262644934&ns1&abbucket20 准备…

【ffmpeg命令入门】Nginx的安装与制作HLS流媒体服务器

文章目录 前言Nginx简介Ubuntu安装Nginxffmpeg生成HLS流媒体1. 生成HLS流媒体命令说明 配置Nginxffplay播放m3u8 总结 前言 在数字内容传输和流媒体服务中,HLS(HTTP Live Streaming)已经成为一种流行的解决方案,特别是在视频直播…

电缆规格型号对照表

一、电线电缆产品主要分为五大类: 1、裸电线及裸导体制品本类产品的主要特征是:纯的导体金属,无绝缘及护套层,如钢芯铝绞线、铜铝汇流排、电力机车线等;加工工艺主要是压力加工,如熔炼、压延、拉制、绞合/紧压绞合等&…

C# 使用pythonnet 迁入 python 初始化错误解决办法

pythonnet 从 3.0 版本开始,必须设置Runtime.PythonDLL属性或环境变量 例如: string pathToVirtualEnv ".\\envs\\pythonnetTest"; Runtime.PythonDLL Path.Combine(pathToVirtualEnv, "python39.dll"); PythonEngine.PythonHom…

【SpringBoot】2 项目搭建

创建项目 1)确实本地 jdk 版本 打开命令行窗口:快捷键 Windows R,输入 CMD,敲回车 执行命令:java -version 2)在项目 clone 的位置创建 Spring Boot 项目,使用 Maven 进行依赖管理&#xff…

LoRA:低秩自适应

LoRA:低秩自适应 本章节是对轻松上手微调大语言模型——QLORA篇中提到的LoRA的原理解释。 背后动机 现今模型的参数量变得越来越大,对预训练模型进行全微调变得越来越不可行。为了解决这个问题有了LoRA(Low-Rank Adaption)的诞生。将可训练…

【更新2022】各省农业科技活动经费(RD)测算 1999-2022 无缺失

各省农业科技活动经费(R&D)测算数据在农业经济学、政策研究和农村发展规划等领域的论文研究中具有重要应用价值。首先,这些数据可以用于分析不同省份在农业科技投入上的差异及其对农业生产力和产出的影响,帮助揭示不同地区农业…

算法——二分查找(day10)

目录 69. x 的平方根 题目解析: 算法解析: 代码: 35. 搜索插入位置 题目解析: 算法解析: 代码: 69. x 的平方根 69. x 的平方根 - 力扣(LeetCode) 题目解析: 老…

Tenable Nessus 10.7.5 (macOS, Linux, Windows) 发布 - #1 漏洞评估解决方案

Tenable Nessus 10.7.5 (macOS, Linux, Windows) 发布 - #1 漏洞评估解决方案 发布 Nessus 试用版自动化安装程序,支持 macOS Sonoma、RHEL 9 和 Ubuntu 24.04 请访问原文链接:https://sysin.org/blog/nessus-10/,查看最新版。原创作品&…

人工智能类——计算机科学与技术

计算机科学与技术是一个非常大的门类。目前计算机科学与技术类招生的专业主要有计算机科学与技术、软件工程、网络工程、信息安全、物联网工程等,后面的几个专业是计算机科学与技术的重要分支,而这个门类的其他分支并没有单列出来一个本科专业&#xff0…

步入新时代,使用区块链服务API打造创新应用

随着区块链技术的兴起,我们正步入一个全新的数据时代——一个由透明性、安全性和去中心化定义的时代。Blockchain公司的区块链API,作为连接现实世界与区块链世界的桥梁,为全球开发者和企业提供了一种前所未有的方式,以访问、交互并…

JS 改造数组对象,将其不确定的key作为value,并合并相同key的value值

const data [{"苹果": 3839,"小米": 1423,"华为": 4965,"oppo": 3334,"vivo": 2820,"一加": 4751},{"苹果": 3560,"小米": 2099,"华为": 3192,"oppo": 4210,"vivo…

互联网产品经理转型升级:如何成功转身为AI产品经理

前言 随着人工智能技术的快速发展,AI产品经理成为了职场热门职位。许多互联网产品经理纷纷寻求转型升级,希望投身AI领域。 一、认清形势,明确目标 了解AI行业发展趋势:关注国家政策、市场动态和技术进步,把握AI行业…