当前位置: 首页 > news >正文

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

目录

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.回溯

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

相关文章:

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

目录 1.什么是递归 1.1二叉树的遍历 1.2快速排序 1.3归并排序 2.为什么会用到递归 3.如何理解递归 4.如何写好一个递归 5.什么是搜索 5.1深度(dfs)优先遍历&优先搜索 5.2宽度(bfs)优先遍历&优先搜索 6.回溯 1.什…...

【云原生】Docker搭建知识库文档协作平台Confluence

目录 一、前言 二、企业级知识库文档工具部署形式 2.1 开源工具平台 2.1.1 开源工具优点 2.1.2 开源工具缺点 2.2 私有化部署 2.3 混合部署 三、如何选择合适的知识库平台工具 3.1 明确目标和需求 3.2 选择合适的知识库平台工具 四、Confluence介绍 4.2 confluence特…...

序列化与反序列化的本质

1. 将对象存储到本地 假如有一个student类,我们定义了好几个对象,想要把这些对象存储下来,该怎么办呢 from typing import List class Student:name: strage: intphones: List[str] s1 Student("xiaoming",10,["huawei&quo…...

飞牛爬虫FlyBullSpider 一款简单方便强大的爬虫,限时免费 特别适合小白!用它爬下Boss的2024年7月底Java岗位,分析一下程序员就业市场行情

一、下载安装FlyBullSpider 暂时支持Window,现在只在Win11上做过测试 1 百度 点击百度网盘 下载 链接:https://pan.baidu.com/s/1gSLKYuezaZgd8iqrXhk8Kg 提取码:Fly6 2 csdn https://download.csdn.net/download/fencer911/89584687 二、体验初…...

EXCEL 排名(RANK,COUNTIFS)

1.单列排序 需求描述:如有下面表格,需要按笔试成绩整体排名。 解决步骤: 我们使用RANK函数即可实现单列整体排名。 Number 选择第一列。 Ref 选择这一整列(CtrlShift向下箭头、再按F4)。 "确定"即可计算…...

【踩坑系列-JS】iframe中的url参数获取

Author:赵志乾 Date:2024-07-24 Declaration:All Right Reserved!!! 1. 问题描述 系统A的页面中以iframe的方式嵌入了系统B的页面,并需要将A页面url中的参数传递给B页面。 最初的实现方式是&am…...

测试工作中常听到的名词解释 : )

背景 很多名称其实看字面意思都挺抽象的,有时看群里的测试大佬在不停蹦这类术语,感觉很高大上,但其实很多你应该是知道的,只不过没想到别人是这样叫它的。又或者你的主编程语言不是 Java,所以看不懂他们在讲啥&#x…...

Linux内网离线用rsync和inotify-tools实现文件夹文件单向同步和双向同步

lsyncd实现方式可参考:https://www.jianshu.com/p/c075ccf89516 安装文件下载:相关文件下载 rsync默认都有,所以没有提供。 服务端和客户端均操作 服务端:双向同步其实都是服务端,只是单向同步时稍有区别 客户端&am…...

Spring Security学习笔记(二)Spring Security认证和鉴权

前言:本系列博客基于Spring Boot 2.6.x依赖的Spring Security5.6.x版本 上一篇博客介绍了Spring Security的整体架构,本篇博客要讲的是Spring Security的认证和鉴权两个重要的机制。 UsernamePasswordAuthenticationFilter和BasicAuthenticationFilter是…...

产品经理NPDP好考吗?

NPDP是新产品开发专业人员的资格认证,对于希望在产品管理领域取得认可的专业人士来说,NPDP认证是一项重要的资格。 那么,产品经理考取NPDP资格认证究竟难不难呢? 首先,NPDP考试的难易程度取决于考生的背景和准备情况…...

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

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

unity美术资源优化(资源冗余,主界面图集过多)

图片资源冗余: UPR unity的性能优化工具检查资源 1.检查纹理读/写标记 开启纹理资源的读/写标志会导致双倍的内存占用 检查Inspector -> Advanced -> Read/Write Enabled选项 2.检查纹理资源alpha通道 如果纹理的alpha通道全部为0,或者全部为2…...

【git】github中的Pull Request是什么

在 Git 中,"pull request"(简称 PR)是一种在分布式版本控制系统中使用的功能,特别是在使用 GitHub、GitLab、Bitbucket 等基于 Git 的代码托管平台时。Pull Request 允许开发者请求将他们的代码更改合并到另一个分支&am…...

gitlab查询分支API显示不全,只有20个问题

背景 gitlab查询分支API需要查询所有分支,且分支数量大于20,但目前调用接口返回的branch最多就显示了20个 解决方案 根据GitLab的文档,查询分支API默认最多返回20个分支。如果要一次性显示80个分支,可以使用分页参数来获取所有…...

vue3+vite 实现动态引入某个文件夹下的组件 - glob-import的使用

<template><div class"user-content"><HeaderTitle title"用户详情"></HeaderTitle><div class"main-content"><div><UserForm /></div><div><TableList></TableList></d…...

hhhhh

x torch.tensor([1.0,0.],[-1.,1.],requires_gradTrue) z x.pow(2).sum() z.backward() x.grad在这段代码中&#xff0c;我们利用 PyTorch 进行自动求梯度&#xff0c;下面详细解释代码的每一个部分及其在反向传播中的作用。同时&#xff0c;我们也将介绍函数对象和叶子节点的…...

扫雷小游戏纯后端版

package com.wind;import java.util.Random; import java.util.Scanner;public class ResultLei {static Random random new Random();public static void main(String[] args) {boolean end true;while (end) {System.out.println("请输入你选择的难度对应的数字&#…...

RuoYi-Vue-Plus(动态添加移除数据源)

一、添加数据 private final DynamicRoutingDataSource dynamicRoutingDataSource;private final DefaultDataSourceCreator dataSourceCreator;//添加一个dynamic的数据源@GetMapping("createDynamic")public void createDynamic() {DataSourceProperty property =…...

idea启动项目报:the command line via JAR manifest or via a classpath file and rerun.

解决方案 1.打开Edit Configurations&#xff0c;进去编辑&#xff0c;如下&#xff1a; 笔记配置 2.选择Modfiy options,点击Shorten command line 3.在新增的Shorten command line选项中选择JAR manifest或classpath file 4.点击保存后即可...

vue3 + ts中有哪些类型是由vue3提供的?

在 Vue 3 中结合 TypeScript 使用时&#xff0c;Vue 提供了一系列的类型帮助函数和接口&#xff0c;这些类型用于增强 TypeScript 的集成和提供类型安全。以下是一些由 Vue 3 提供的常用 TypeScript 类型&#xff1a; RefType: 用于标注一个 ref 返回的响应式引用类型。Reacti…...

DMRG-SCF方法:量子化学强关联系统的高效计算方案

1. DMRG-SCF方法概述&#xff1a;量子化学中的强关联系统解决方案密度矩阵重整化群自洽场&#xff08;DMRG-SCF&#xff09;方法是近年来量子化学领域最具突破性的进展之一&#xff0c;它巧妙结合了两种经典理论的优势。作为一位长期从事量子化学计算的科研人员&#xff0c;我见…...

基于MCP协议的AI智能体安全扫描器:架构、部署与实战指南

1. 项目概述&#xff1a;一个为AI智能体设计的“安全门卫”最近在折腾AI智能体&#xff08;Agent&#xff09;的落地应用&#xff0c;发现一个挺普遍但容易被忽视的问题&#xff1a;当你的智能体开始联网、调用工具、处理外部数据时&#xff0c;它接收到的信息就像从四面八方涌…...

国星宇航冲刺港股:年营收7亿亏2.6亿 刚募资36亿 估值116亿 刚发射两颗实验卫星失败

雷递网 雷建平 5月14日成都国星宇航科技股份有限公司&#xff08;简称&#xff1a;“国星宇航”&#xff09;日前更新招股书&#xff0c;准备在港交所上市。在2023年12月底&#xff0c;国星宇航完成了5.22亿元融资&#xff0c;投后估值为41.2亿元&#xff0c;2024年12月底&…...

【maaath】Flutter for OpenHarmony 体重管理应用开发实战

Flutter for OpenHarmony 体重管理应用开发实战&#xff1a;从数据模型到完整功能实现欢迎加入开源鸿蒙跨平台社区&#xff1a;https://openharmonycrossplatform.csdn.net 作者&#xff1a;maaath一、前言 随着 OpenHarmony 生态的快速发展&#xff0c;Flutter for OpenHarmon…...

智能体框架构建指南:从核心原理到工程实践

1. 项目概述&#xff1a;从代码仓库到智能体构建框架的深度解读最近在开源社区里&#xff0c;一个名为1kurepin/agentify的项目引起了我的注意。乍一看&#xff0c;这只是一个普通的 GitHub 仓库名&#xff0c;但如果你对当前 AI 领域&#xff0c;特别是智能体&#xff08;Agen…...

CircuitPython嵌入式开发入门:从LED闪烁到DVI显示的综合实践指南

1. 项目概述&#xff1a;从“Hello, World!”到硬件交互的艺术 如果你对编程稍有了解&#xff0c;一定听说过“Hello, World!”——那个向世界宣告程序开始运行的经典仪式。在桌面编程的世界里&#xff0c;它可能是一行打印在终端上的文字。但在嵌入式开发这片天地里&#xff…...

云原生架构师成长指南:从容器化到可观测性的实战体系

1. 项目概述&#xff1a;从代码到云端的架构师成长之路最近在技术社区里&#xff0c;一个名为“SKY-lv/cloud-architect”的项目仓库引起了我的注意。乍一看&#xff0c;这像是一个个人学习笔记或知识库&#xff0c;但深入探究后&#xff0c;我发现它远不止于此。它更像是一位资…...

开源AI Agent项目MatchClaws:用LLM重塑社交匹配与对话体验

1. 项目概述&#xff1a;当AI遇见约会&#xff0c;一个开源智能体如何重塑社交连接最近在GitHub上闲逛&#xff0c;发现了一个挺有意思的项目&#xff1a;jessastrid/matchclaws-ai_agent_dating。光看名字&#xff0c;你可能会觉得这又是一个蹭AI热度的概念玩具&#xff0c;但…...

用了半年只留下这1个!2026年我上课录音转文字亲测好用真心安利

测了大半年市面上主流的录音转文字工具&#xff0c;删来删去最后我手机、电脑里只留了一个——听脑AI&#xff0c;说真的&#xff0c;这是我用过同类工具里最值得入手的&#xff0c;没有之一。很多人选工具都踩了只看表面订阅价的坑&#xff0c;其实真不是越便宜越好&#xff0…...

Logo设计全流程指南:从品牌定位到视觉落地的核心逻辑

初创企业团队常面临标志图形难以传递核心业务的现实困境。脱离市场认知的视觉符号会导致后续传播成本成倍增加。本文系统拆解标志构建的标准作业路径&#xff0c;提供可量化验证的参数指标与执行清单。读者可依据本框架完成从抽象概念到商用矢量文件的完整转化。有效规避重复试…...