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

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

📝前言说明:

  • 本专栏主要记录本人递归、搜索与回溯算法的学习以及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算法
  • 专题六:记忆化搜索

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

相关文章:

  • java加强 -List集合
  • 应急响应基础模拟靶机-security2
  • 御网杯2025 Web,Msic,密码 WP
  • 深入解析多选字段的存储与查询:从位运算到数据库设计的最佳实践
  • uni-app学习笔记(二)--vue页面代码的构成和新建页面
  • html body 设置heigth 100%,body内元素设置margin-top出滚动条(margin 重叠问题)
  • [学习]RTKLib详解:convkml.c、convrnx.c与geoid.c
  • 二、transformers基础组件之Tokenizer
  • 智能座舱开发工程师面试题
  • vue中理解MVVM
  • Ubuntu 22虚拟机【网络故障】快速解决指南
  • Qt坐标系 + 信号和槽 + connect函数(8)
  • LangChain入门(七) 提取和输出结构化数据
  • AI Agent(10):个人助手应用
  • 19、DeepSeek LLM论文笔记
  • ActiveMQ 生产环境问题排查与调优指南(一)
  • C语音学习---函数指针
  • MyBatis源码解读4(2.3、MyBatis运行流程)
  • 【ajax基础】
  • openjdk底层汇编指令调用(一)——汇编指令及指令编码基础
  • 第二期人工智能能力建设研讨班在京开班,近40国和区域组织代表参加
  • 中医的千年传承:网络科学描绘其演化之路|PNAS速递
  • 科学家用AI寻找外星生命
  • 减重人生|走过节食弯路,她如何半年减60斤找回自信?
  • 视频丨习近平同普京在主观礼台出席红场阅兵式
  • 850亿元!2025年中央金融机构注资特别国债(一期)拟第一次续发行