【数据结构与算法】递归全流程详细剖析 | 详解图的深度优先遍历

news2025/7/19 10:13:32

🚀 作者 :“大数据小禅”

🚀文章简介:本篇文章属于数据结构与算法系列文章,这篇文章会对算法中的递归进行一个详细的介绍,不仅是概念,而是从运行过程中的每一步进行详细分析。并使用递归的方式来完成数据结构图的深度优先遍历

🚀个人主页: 大数据小禅

在这里插入图片描述

图的遍历与递归

      • 1. 递归初体验
        • 1.1 使用递归实现阶乘操作
      • 2. 递归调用详解
        • 2.1 普通的函数递归调用过程
        • 2.2 递归函数的调用过程
      • 3. 图的深度优先遍历DFS
        • 3.1 图的表示
        • 3.2 图的深度优先遍历
        • 3.3 详解深度优先种的递归遍历
        • 3.4 递归过程执行流程详解

1. 递归初体验


  • 什么是递归
    • 递归就是一个程序或者是函数在调用自身的一种方法。
    • 这一种方法通常是把一个复杂的问题经过层层的转化为跟原问题相似但规模较小的问题来求解。
    • 递归策略只需要使用少量的程序就可以把解题过程需要多次的重复计算描述出来,大大的减少了代码量。
    • 一般来说递归需要边界条件,递归前进段和递归返回段,当边界条件不满足的时候,递归前进,当边界条件满足的时候就递归返回。
  • 递归必须具备条件
    • 自己调用自己
    • 有终止条件

1.1 使用递归实现阶乘操作

        public static void main(String[] args) {
            int result = factorial(5);
            System.out.println("5的阶乘结果是:"+result);

        }
        // 求n的阶乘

        public static int factorial(int n) {
            if (n <=1) {
                return 1;
            }
            return n * factorial(n - 1);
        }
输出:
5的阶乘结果是:120

2. 递归调用详解

2.1 普通的函数递归调用过程

  • 步骤1:函数A执行,调用函数B,这个时候A函数暂时挂起,函数B调用函数C,B暂时挂起
  • 步骤2:函数C执行完之后,就回到B函数调用C函数的地方,去执行C函数调用后B函数还没执行完的的其他逻辑:。
  • 步骤3:整个执行完之后B函数也执行完了,再返回到A函数调用B函数的地方,继续执行B函数下面的所有逻辑
    在这里插入图片描述

2.2 递归函数的调用过程

  • 跟普通函数的调用没什么区别,就是每一次调用的是自己,调用自己后挂起,去执行调用的本身的函数。
  • 传入的参数会变化,执行到了终止的条件之后一样往回执行之前接下去没有执行完的代码。
    在这里插入图片描述

3. 图的深度优先遍历DFS


  • 图是一种数据结构 每一种数据结构都必须有"遍历"的方式

  • 很多算法 本质就是“遍历” ** 对于图论,真正理解"遍历"可以解决80%**的面试问题

  • 通常不会用图这种数据结构来存储数据,或者进行搜索查找的任务。更多的是存储一种拓扑关系,之后通过图论算法来寻找这种拓扑关系中隐藏的性质。比如看两个节点是否相连,最短路径,或者一个图的最小生成树

  • 对树的遍历一般不需要整棵树的元素遍历 但是图的话一般是寻找图中某种拓扑结构的性质,想要得到一般需要把整个图遍历一遍,遍历过程中可能还需要不断记录一些信息,最终得到结果。

3.1 图的表示

图的基本概念与图的基本表示
图的表示可以看我的前一篇文章 这里采用邻接表的方式来表示一个图无向无权图。

3.2 图的深度优先遍历

1 深度优先遍历,从给定的起始节点出发,起始节点一般有多个相邻节点。深度优先遍历的策略就是先访问起始节点的第一个邻接节点,
然后再以这个被访问的邻接结点作为新的起始节点,再访问它的第一个邻接结点。
指导遍历完成

2 深度优先遍历可通过递归的方式来完成,下面分析实现的核心代码与过程

3.3 详解深度优先种的递归遍历

在这里插入图片描述
核心部分代码:
在这里插入图片描述

3.4 递归过程执行流程详解

  1. int v=0开始,执行dfs(0),当前数组空,数组下标为0的地方标记为true,0添加进List。
  2. 访问0的相邻节点,1跟2,发现1不存在数组中,调用dfs(1),这个时候dfs(0)挂起先执行dfs(1)
  3. 数组下标为1的地方设置为true,把1添加进List,遍历节点1的相邻节点 0,3,4。这个时候0已经在数组中存在,跳过继续看3,发现3不在数组中,则把dfs(1)挂起,调用dfs(3).
  4. 把3添加进List中,3下标设置为true,继续走下面的逻辑。依次类推指导调用到dfs(5)。此时的调用路径是dfs(0)->dfs(1)->dfs(3)->dfs(2)->dfs(6)->dfs(5)。
  5. 此时的List中遍历结果为 0 1 3 2 6 5。调用到dfs(5)的时候发现5的所有相邻顶点都访问过了。
  6. 表示对于dfs(5)的调用for循环已经结束了,下面没有其他逻辑了。这个时候就要返回上一次递归调用的过程dfs(6)了。dfs(0)->dfs(1)->dfs(3)->dfs(2)->dfs(6)
  7. 回到dfs(6),把dfs(6)没执行完的逻辑继续执行。上次对dfs(6)执行到了遇到了5这个节点的时候就进行递归调用了,而5这个顶点已经结束调用,对于6这个顶点也是遍历完了。退回dfs(0)->dfs(1)->dfs(3)->dfs(2),依次类推,直到退回到dfs(3)这个时候,上次这个函数执行到了遍历递归节点2的时候就去递归调用了,这个时候dfs(2)已经调用完了,现在可以继续往下遍历,还有节点5.
  8. 这个时候dfs(5),5的相关顶点也已经是true了也不需要递归调用了,继续往回退dfs(0)->dfs(1)
  9. 上次调用dfs(1)的时候执行到了顶点3,现在继续往下执行,调用了dfs(4),这个时候顶点4还是没有被调用过的,记录为true,加入到List。 0 1 3 2 6 5 4。dfs(0)->dfs(1)->dfs(4).
  10. 调用完dfs(4),其相邻的顶点也已经被遍历完了,这个时候继续往回退,直到dfs(0)执行完相应顶点逻辑。到这里就遍历完成。

遍历结果

[0, 1, 3, 2, 6, 5, 4]

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

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

相关文章

Vue3 - 使用 mitt.js 进行组件通信(兄弟关系)

前言 在 Vue2 中&#xff0c;两个同级&#xff08;兄弟关系&#xff09;的组件传递数据&#xff0c;都是利用一个叫 EventBus 事件总线&#xff0c;利用这根总线&#xff0c;可以让两个毫无关系的组件进行通信。 其实这个问题的本质核心解决方案&#xff0c;就一句话。通过第三…

开传奇需要什么技术要什么条件

开传奇需要什么技术要什么条件 对于这个问题&#xff0c;近期问的人比较多。这也是热爱传奇这个游戏的朋友会问到的一个问题&#xff0c;因为喜欢玩这个游戏&#xff0c;也想要自己去开一个经营一个 不管是电脑端还是手机端。但是对于一些新手确实不知道该如何开始操作从哪些方…

基于PHP+MySQL的校园二手旧书回收捐赠系统

校园内因为所教授的课程比较多,人数基数也比较大,所以每年都会产生大量的二手废旧图书,很多时候这些图书还可以进行二次利用,如果直接当废品进行回收很暴殄天物的,所以为了能够让这些校园内的二手图书得到更多的利用,我们开发了PHP校园二手旧书回收捐赠系统 本系统分为前台和后…

「Redis数据结构」压缩列表(ZipList)

「Redis数据结构」压缩列表&#xff08;ZipList&#xff09; 文章目录「Redis数据结构」压缩列表&#xff08;ZipList&#xff09;一、概述二、结构三、连锁更新问题四、压缩列表的缺陷五、小结参考ZipList 是一种特殊的“双端链表” &#xff0c;由一系列特殊编码的连续内存块…

基于协同过滤进行金融产品个性化推荐 代码+数据

1.案例简介 (1)方法概述: 本教程包含如下内容: 从原始的数据文件中加载数据,进行训练集和测试集的切分。 对数据分batch, 利用用户侧信息,和商品侧信息,进行双塔模型的训练 结果展示 (2)宏观流程图 (3)案例知识点 pytorch 视频CTR预估指标 博客point wise 以及 pair wise …

从0到1图文教你如何将spring boot项目部署到minikube中去

这里是weihubeats,觉得文章不错可以关注公众号小奏技术&#xff0c;文章首发。拒绝营销号&#xff0c;拒绝标题党 源码 本项目博文的源码已上传github&#xff0c;有需要自取 github: https://github.com/weihubeats/weihubeats_demos/tree/master/spring-boot-demos/spring-…

C#界面里Control.Enabled 属性的使用

C#界面里Control.Enabled 属性的使用 在开发中即使一个细节也可以决定成败。 前段时间刚好是毕业季,公司招聘了很多应界毕业生, 由于项目非常多,许多老手都已经分配到各个项目上去,还有一些小项目不得不让这些新生力军来接手。 这些初生牛犊不怕虎,天天加班,夜夜苦战…

idea打开之前的项目不能正常编译/idea中项目Compile output丢失问题

报错笔记 文章目录错误一&#xff1a;Cannot resolve class or package java错误二&#xff1a;Compile output丢失问题下面的报错发生情况都是打开之前写的JavaWeb文件时&#xff0c;各个文件中的代码爆红错误一&#xff1a;Cannot resolve class or package ‘java’ 在idea…

【安卓应用渗透】第一篇:安卓逆向回顾和梳理-2211

文章目录安卓开发课程回顾第一课&#xff1a;安卓项目文件结构&#xff08;逻辑视图&#xff09;第五课&#xff1a;文件读取和数据库存取文件存取SQLite数据库存取安卓开发&#xff1a;案前资料库安卓逆向课程回顾第一课&#xff1a;基础逆向工具&#xff08;Apktool, Keytool…

【分享】订阅金蝶云进销存集简云连接器同步销货数据至金蝶云进销存系统

方案场景 在企业规模不断壮大的过程中&#xff0c;企业都是在钉钉内提交OA审批&#xff0c;并通过人工的方式统计多种审批数据&#xff0c;然后手动导入到某系统内&#xff0c;如果中间有调整又需要从头再进行核对&#xff0c;繁琐的流程严重影响了业务拓展。基于该方式企业希…

[附源码]SSM计算机毕业设计重庆工程学院教师宿舍管理系统论文JAVA

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

Eolink征文活动--推荐国产神器Eolink!API优先,Eolink领先!

前言&#xff1a; 在我们后端开发者做项目的时候&#xff0c;避免不了与前端界面的交互&#xff0c;对于我来讲&#xff0c;在做项目的时候用到过postman&#xff0c;swagger做接口测试工作&#xff0c;在公司的时候公司主要用YApi可视化接口平台&#xff0c;最近使用了一个爆款…

负担过重何以轻装前行

随波逐流并不一定过得容易。 猜测负担过重原因&#xff1a; 所作的事情和预期差异大自己并不擅长目前所从事的专业恐惧失败试错成本过高基础薄弱无法持续成长简单问题复杂化复杂问题简单化…… 如何改变这种情况&#xff1f; 自我认知和外部感知都存在分析错位和信息不对称的…

解决ggplot绘制散点图形状超过6个的警告

正常画图&#xff1a; library(ggplot2) ggplot(mpg,aes(displ,hwy))geom_point(aes(shapeclass,colorclass))可以看出形状少了一个&#xff0c;SUV没有形状 并且还会弹出这样的警告&#xff1a; Warning message: “The shape palette can deal with a maximum of 6 discrete…

【附源码】Python计算机毕业设计网络求职招聘系统

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

更灵活定位内存地址的方法

更灵活定位内存地址的方法 文章目录更灵活定位内存地址的方法1.and和or2.以字符形式给出的数据3.[bxidata]4.SI、DI与寻址方式的灵活应用1.and和or and指令&#xff1a;逻辑与指令&#xff0c;按位进行与运算(同真为真) 比如&#xff1a; mov al, 01100011B and al, 00111011B …

速锐得适配进口福特烈马BRONCO车载 CAN总线应用随动转向大灯改装

适配进口福特烈马BRONCO车载 CAN总线应用随动转向大灯改装&#xff0c;必须先获得福特烈马BRONCO的原厂电路图纸&#xff0c;为此&#xff0c;速锐得准备了福特诊断仪、福特烈马BRONCO原厂电路图纸工具&#xff0c;适配装置、CAN数据采集设备、软件及线缆等一系列工具。 我们首…

【附源码】Python计算机毕业设计石家庄学院跳蚤市场

项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等等。 环境需要 1.运行环境&#xff1a;最好是python3.7.7&#xff0c;…

[数据结构]二叉树的链式结构

作者&#xff1a; 华丞臧专栏&#xff1a;【数据结构】 各位读者老爷如果觉得博主写的不错&#xff0c;请诸位多多支持(点赞收藏关注)。如果有错误的地方&#xff0c;欢迎在评论区指出。推荐一款刷题网站 &#x1f449; LeetCode刷题网站 目录 前言 一、二叉树的链式结构 二…

10 种创新的智慧废弃物管理技术

美国人每年产生约 2.5 亿吨垃圾&#xff0c;其中只有 34% 被回收。尽管有环保意识&#xff0c;但其他几项统计资料&#xff0c;揭示了令人震惊的垃圾倾向。废弃物管理的复杂性以前从未如此极端&#xff0c;这就是为什么今天这个行业僱用了近 50 万人&#xff0c;他们承担着每天…