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

【递归、搜索与回溯算法】导论

📝前言说明:

  • 本专栏主要记录本人递归、搜索与回溯算法的学习以及LeetCode刷题记录,按专题划分
  • 每题主要记录:(1)本人解法 + 本人屎山代码;(2)优质解法 + 优质代码;(3)精益求精,更好的解法和独特的思想(如果有的话)
  • 文章中的理解仅为个人理解。如有错误,感谢纠错

🎬个人简介:努力学习ing
📋本专栏:C++刷题专栏
📋其他专栏:C语言入门基础,python入门基础,C++学习笔记,Linux
🎀CSDN主页 愚润泽

你可以点击下方链接,进行该专题内不同子专题的学习

暂时没有暂时没有

目录

  • 一,名词解释
    • 1, 递归
      • 1.1 什么是递归
      • 1.2 为什么会用到递归
      • 1.3 如何理解递归
        • 1.3.1 理解递归展开的细节图
        • 1.3.2 利用部分基础二叉树题目来感受
        • 1.3.3 宏观看待递归过程
      • 4. 如何写好一个递归
  • 二,搜索 vs 深度优先遍历 vs 深度优先搜索 vs 宽度优先遍历 vs 宽度优先搜索 vs 暴搜
    • 1. 深度优先遍历 vs 深度优先搜索
    • 2. 广度优先遍历 vs 广度优先搜索
    • 3. 暴搜
    • 4 扩展搜索问题
  • 三,回溯与剪枝
  • 四,本专栏介绍

一,名词解释

递归和搜素与回溯的关系是:递归包含搜索,搜索包含回溯

1, 递归

1.1 什么是递归

  • 函数自己调用自己。

1.2 为什么会用到递归

  • 以,二叉树的遍历,快排,归并为例:
  • 解决主问题 → 遇到相同子问题
  • 解决子问题 → 遇到相同子问题

在这里插入图片描述

1.3 如何理解递归

1.3.1 理解递归展开的细节图

以前序遍历为例:
在这里插入图片描述

1.3.2 利用部分基础二叉树题目来感受

因为二叉树本身就具有非常强的递归特性,这里给三道题目:

  • 单值二叉树
  • 相同的数
  • 另一棵树的子树
1.3.3 宏观看待递归过程

当我们对递归有一定的感知以后,我们写递归题目的时候,不要过度关心细节,应该宏观看待递归过程
怎么宏观:

  • 不要关系递归的细节展开图(不要题题都想着展开搞明白调用流程)
  • 把递归函数当做一个黑盒子(我们只管用就行了)
  • 相信这个黑盒子一定能返回我们要的结果

4. 如何写好一个递归

  • 先找到相同的子问题 → 函数头的设计
  • 只关心一个子问题是如何解决的 → 函数体的设计
  • 子问题不能再分时 → 注意递归函数的出口(结束条件)

以后续遍历为例:

  • 父问题:对对应根节点的树进行后续遍历。子问题:对子树也后续遍历 → 函数头(传入根节点)
  • 子问题如何解决: 先访问左子树和右子树(我们相信递归函数一定能完成),然后再访问根节点printf
  • 递归出口:当节点为NULL

在这里插入图片描述

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

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

  • 前序遍历就是一种深度优先遍历(dfs),即:一条路走到头,不能再走了才返回去走其他路
  • 深度优先搜索:本质和深度优先遍历一样,只是目的是搜索
  • 关系:遍历是形式,目的是搜索

2. 广度优先遍历 vs 广度优先搜索

  • 如层序遍历,就是广度优先遍历(bfs)
  • 两者关系与 深度优先遍历 vs 深度优先搜索之间的关系一样

3. 暴搜

暴搜,即:暴力枚举一遍所有结果(如:dfsbfs

4 扩展搜索问题

除了与二叉树有关的问题,其他问题我们能否用递归呢?
下面以求1、2、3全排列的所有结果 举例:
我们把问题画成树状图:
在这里插入图片描述
上面就是一颗决策树,一样可以用dfs得到所有结果

三,回溯与剪枝

回溯:

  • 回溯的本质就是深度搜索
  • 在深搜过程中,发现一条路走到头了,进行回溯

剪枝:

  • 发现一条路肯定是错的,没必要再走时,剪枝

在这里插入图片描述
红色部分就是回溯
剪枝:

  • 如,橙色的①和②
  • 先走了①,发现走不通于是回溯到分叉口位置,然后走②,发现也走不通,也回到分叉口位置
  • 此时,可以选择往上走和往下走,但是①必然是不正确的选择(因为之前已经得出结论了),所以直接剪枝,不走上面

四,本专栏介绍

本专栏会有以下专题:

  • 专题一:递归
  • 专题二:二叉树的深搜
  • 专题三:穷举 vs 暴搜 vs 深搜 vs 回溯 vs 剪枝
  • 专题四:综合练习
  • 专题五:FloodFill算法
  • 专题六:记忆化搜索

🌈我的分享也就到此结束啦🌈
要是我的分享也能对你的学习起到帮助,那简直是太酷啦!
若有不足,还请大家多多指正,我们一起学习交流!
📢公主,王子:点赞👍→收藏⭐→关注🔍
感谢大家的观看和支持!祝大家都能得偿所愿,天天开心!!!

http://www.xdnf.cn/news/5375.html

相关文章:

  • 2025第九届御网杯网络安全大赛线上赛 区域赛WP (MISC和Crypto)(详解-思路-脚本)
  • [Java实战]Spring Boot 快速配置 HTTPS 并实现 HTTP 自动跳转(八)
  • Java反序列化漏洞
  • 第一章 初识Java
  • Kotlin Multiplatform--03:项目实战
  • 机器学习总结
  • C/C++实践(四)C++跨平台开发的系统性挑战与深度解决方案
  • 基于SpringBoot的小区停车位管理系统
  • 集合(1)
  • MATLAB中矩阵和数组的区别
  • Python-Venv多环境管理
  • JavaEE--文件操作和IO
  • cookie和session的区别
  • Qt开发经验 --- 避坑指南(14)
  • 【Linux篇】高并发编程终极指南:线程池优化、单例模式陷阱与死锁避坑实战
  • SpringBoot主入口类分析
  • 虚幻引擎5-Unreal Engine笔记之UE编辑器退出时的保存弹框
  • 【QT】UDP通讯本地调试
  • Pandas 时间处理利器:to_datetime() 与 Timestamp() 深度解析
  • 趣味编程:四叶草
  • Python赋能自动驾驶:如何打造高效的环境感知系统
  • 嵌入式硬件篇---TOF|PID
  • 微软向现实低头:悄悄延长Windows 10的Microsoft 365支持
  • 每日c/c++题 备战蓝桥杯(P1002 [NOIP 2002 普及组] 过河卒)
  • 数据仓库Hive
  • 【即插即用涨点模块】RFAConv感受野注意力卷积:突破卷积参数共享瓶颈,感受野注意力重塑空间特征提取【附源码】
  • 深度剖析多模态大模型中的视频编码器算法
  • 高级数据结构:线段树
  • 《Redis应用实例》学习笔记,第一章:缓存文本数据
  • HVV蓝队初级面试总结