【递归搜索回溯专栏】前言与本专栏介绍

本专栏内容为:递归,搜索与回溯算法专栏。 通过本专栏的深入学习,你可以了解并掌握算法。

💓博主csdn个人主页:小小unicorn
⏩专栏分类:递归搜索回溯专栏
🚚代码仓库:小小unicorn的代码仓库🚚
🌹🌹🌹关注我带你学习编程知识

前言

  • 递归
    • 什么是递归
    • 为什么会用到递归
    • 如何理解递归
    • 怎样写好递归
  • 搜索
    • 深度优先/宽度优先
    • 关系图
    • 拓展搜索
  • 回溯与剪枝

递归

什么是递归

在讲解递归前,我们首先要知道什么是递归:
递归我们之前是接触过的:
在c语言中我们详细学过递归,数据结构中的快排,二叉树也用到了递归。

简单来说,递归就是函数自己调用自己。

为什么会用到递归

那么为什么会用到递归呢?
举两个例子:
例子一
在这个二叉树中:我们用前序遍历来遍历这个树:
在这里插入图片描述
先访问蓝色节点,然后将这个树分为左子树和右子树:
在这里插入图片描述
在左子树中,我们继续根据前序遍历(根左右)进行划分:

在这里插入图片描述
依次内推:将这个树不停的划分成:根,左子树,右子树。

我们的主问题是根左右,而子问题也是根左右,子问题的子问题的也是根左右。子问题是相同的。

例子二
我们复习一下快排:
在这里插入图片描述
找一个key,将数组从key位置划分为左右两个部分,让这两个左右部分排序。而让左右两个部分排序,又可以进行划分,在左右两个数组继续用Key进行划分:
在这里插入图片描述
依次内推:不停的划分,知道最后不停划分为两个元素后大小就很好比较。

这个例子我们也可以发现主问题是通过key将数组划分为两部分,而子问题也是通过key将数组划分为两部分,子问题的子问题也是通过key将数组划分为两部分。

通过这两个例子,我们想告诉递归的本质:
递归的本质其实就是重复的子问题,也就是说主问题可以划分成一个跟主问题相同的子问题
在这里插入图片描述

如何理解递归

那么如何理解递归?
这里给出两点:

  1. 递归展开
  2. 宏观看待递归的过程

想要理解递归,就要画一下递归的展开图,将递归通过展开图展开,会很明显看到递归相关细节:返回条件,如何递归

其次我们要宏观看待一个递归得到过程:
具体分一下几步:

  1. 不要在意递归的细节展开图
  2. 把递归的函数当成一个黑盒
  3. 相信这个黑盒一定能把这件事做好

就比如我们的二叉树后序遍历:

在这里插入图片描述
首先我们要通过根节点来进行遍历,黑盒装什么呢?
我们知道后序是:左->右->根
那么我们就坚信dfs(root->left)一定能帮我们实现进行左子树的遍历,dfs(root->right)一定能帮我们实现进行右子树的遍历
这就相当于是我们的黑盒。

但是还要注意一个细节:
为了防止进行死循环,我们要写一个出口(也就是返回条件)

怎样写好递归

有了上面的经验,怎样写好递归就很简单:

  1. 先找到相同子问题(这就是我们函数头的设计)
  2. 只关心某一个问题是如何来的(这就涉及到函数体的书写)
  3. 注意细节:递归函数出口防止死循环
    在这里插入图片描述

搜索

深度优先/宽度优先

首先要知道什么是深度优先,什么是宽度优先:
深度优先:深度优先就是一条道走到黑,我们也叫DFS,通常用递归实现。
在这里插入图片描述
跟二叉树遍历一样,从根开始,一直往下走,知道左子树最后一个节点走完不能再走了就往上走。

宽度优先:宽度就是一层一层的剥开,我们也叫BFS,通常借助队列实现。
在这里插入图片描述
就比如还是二叉树遍历,我们一层一层的进行遍历,将每一层遍历出来。

在这里插入图片描述
那么深度优先遍历和深度优先搜索又有什么区别呢?
其实遍历和搜索大致是一样的,记住一点:遍历知识形式,就比如二叉树遍历只是根据规则进行遍历,而搜索是遍历里面的值,因此也叫搜索。

关系图

其实搜索也叫暴搜,暴搜顾名思义就是暴力枚举一遍所有的情况。
在这里插入图片描述

拓展搜索

其实我们之前学过的全排列就是一个搜索问题。

以123三个数的全排列为例,我们高中就学过,要想枚举出全部的结果,用树状能很清晰的表达出来:
在这里插入图片描述
通过树状这样画出来就不会漏解的情况。

这棵树我们也把它叫做决策树。

回溯与剪枝

什么是回溯,什么是剪枝,其实他们两的本质也还是搜索!!!
回溯还是以二叉树遍历为例:

在这里插入图片描述
当遍历到左子树的最左节点,他的左子树为空,那么就要返回,而这个返回的过程就是回溯。

以这个迷宫为例子:

在这里插入图片描述
第一段红线走到尽头发现走不掉了,往回走的过程就是回溯。

根据暴搜原理,会一直往右走,走到尽头,向上走,走到尽头发现到头了,就往回走,然后往左走,往右走,依次内推。在这个过程中,有一段是没有必要走的路段(没有价值的路段),在本图中是画叉的路段,这个画叉的路段我们就可以舍去,舍去的过程就是剪枝。

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

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

相关文章

【YOLO v5 v7 v8 小目标改进】ODConv:在卷积核所有维度(数量、空间、输入、输出)上应用注意力机制来优化传统动态卷积

ODConv:在卷积核所有维度(数量、空间、输入、输出)上应用注意力机制来优化传统的动态卷积 提出背景传统动态卷积全维动态卷积效果 小目标涨点YOLO v5 魔改YOLO v7 魔改YOLO v8 魔改 论文:https://openreview.net/pdf?idDmpCfq6Mg…

LeetCode54题:螺旋矩阵(python3)

路径的长度即为矩阵中的元素数量,当路径的长度达到矩阵中的元素数量时即为完整路径,将该路径返回。 循环打印: “从左向右、从上向下、从右向左、从下向上” 四个方向循环打印。 class Solution:def spiralOrder(self, matrix: List[List[i…

计算机网络_2.2物理层下面的传输媒体

2.2物理层下面的传输媒体 一、传输媒体的分类二、导向型传输媒体1、同轴电缆2、双绞线3、光纤(1)光纤通信原理(2)光纤组成(4)多模光纤与单模光纤对比(5)光纤的波长与规格&#xff08…

AttributeError: ‘list‘ object has no attribute ‘view‘

问题描述 训练yolov9的时候遇到了下面的问题。 In loss_tal.py: pred_distri, pred_scores torch.cat([xi.view(feats[0].shape[0], self.no, -1) for xi in feats], 2).split( (self.reg_max * 4, self.nc), 1) The error is as follows: AttributeError: list …

NLP - 神经网络与反向传播

使用神经网络进行命名实体识别(二值词窗分类) 根据上下文窗口 建立词向量 通过一个神经网络层,通过一个逻辑分类器,得到这个概率是属于特定实体词的预测概率。 另一个分类器来比较说明 这个词是哪个实体类型(比较概率…

赵本山与高秀敏夫妇本想找范伟要那1200元电视机垫款,却不好意思向范伟开口--小品《面子》(中1)的台词

赵本山与高秀敏夫妇本想找范伟要那1200元电视机垫款,却不好意思向范伟开口 --小品《面子》(中1)的台词 表演者:赵本山 高秀敏 范伟 (接上) 高秀敏:咱俩抓紧提事啊 赵本山:不着急…

Python 迭代器和生成器的妙用

本文将探讨python的迭代器和生成器在实际场景中的一些巧妙用法。掌握迭代器和生成器的使用,能够让开发者在解决实际问题时更加得心应手。 Python 迭代器的妙用 Python 的迭代器是一个实现了迭代器协议的对象,它包含方法 __iter__() 和 __next__()。迭代…

实现任意系统下载office文件的域控

一.背景 最近用户提出需求:某个系统A下载的excel文档需要进行权限控制,比如只能下载文档的用户(即文档owner)查看或者编辑,其他人想要查看或者编辑,需要文档owner进行手动设置,当然也可以手动取…

初识C语言—指针

.h 头文件(函数的声明,类型的声明,头文件的包含) .c 源文件(函数实现) 浮点数的四舍五入,不能用你肉眼看到的数值来计算,因为浮点数在内存中有可能不能精确保存。 内存&#xff1a…

ICML23 - Synthetic Data for Model Selection

前言 如果你对这篇文章感兴趣,可以点击「【访客必读 - 指引页】一文囊括主页内所有高质量博客」,查看完整博客分类与对应链接。 本文关注的问题为:是否可以使用合成数据(Synthetic Data)用于模型选择?即不…

多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网络多输入多输出预测

多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网络多输入多输出预测 目录 多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网络多输入多输出预测预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 多输入多输出 | Matlab实现RIME-BP霜冰算法优化BP神经网…

MySQL 外键约束 多表联查 联合查询

外键约束 外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。 有一张学生表和班级表,学生表通过班级表的ID引用到该班级,从而进行关联,而通过外键约束可以保证数据的一致性完整性。 如学生ID18关联到课程ID1号…

瑞吉苍穹外卖如何拓展?已经经过不同公司多轮面试。项目中会问到哪些问题?以及问题如何解决?

别催了,别催了,先收藏吧。 作者大大正在加班加点完成。 文章会尽快发布,关注收藏,尽请期待。 想要加入并查阅作者的知识库可以联系作者 不要白嫖,通过后,附上关注和收藏截图。 已有众多小伙伴加入 目前…

MySql安全加固:可信IP地址访问控制 设置密码复杂度

MySql安全加固:可信IP地址访问控制 & 设置密码复杂度 1.1 可信IP地址访问控制1.2 设置密码复杂度 💖The Begin💖点点关注,收藏不迷路💖 1.1 可信IP地址访问控制 当您在创建用户时使用’%作为主机部分,…

Day20-磁盘管理

Day20-磁盘管理 1. cut 切:2. 磁盘历史和内外部物理结构介绍2.1 磁盘发展趋势和实现措施2.2 磁盘知识的体系结构2.3 机械磁盘的外部结构2.4 SSD固态硬盘的外部结构2.5 固态硬盘内部结构2.6 缓存在服务器各硬件上的速度和大小对比另类维度图解,从上到下由高速到低速&…

2024现代Android开发趋势

2024现代Android开发趋势 在当今的Android开发领域,我们看到了许多令人兴奋的技术和趋势,这些技术和趋势正在改变着应用程序的开发方式和用户体验。让我们一起深入探讨2024年现代Android开发的主要方向和关键技术。 无处不在的Kotlin Kotlin已经成为An…

202435读书笔记|《半小时漫画中国史》——读点经济学与历史,生活更美好,趣味烧脑土地制度、商鞅变法、华丽丽的丝绸之路这里都有

202435读书笔记|《半小时漫画中国史》——读点经济学与历史,生活更美好,趣味烧脑土地制度、商鞅变法、华丽丽的丝绸之路这里都有 1. 土地政策、度量衡及税收2. 商鞅变法3. 西汉经济4. 西汉盐铁大辩论5. 西汉丝绸之路 《半小时漫画中国史:经济…

吸猫毛空气净化器哪个好?推荐除猫毛效果好宠物空气净化器品牌

当下有越来越多的家庭选择养宠物!尽管家里变得更加温馨,但养宠可能会带来异味和空气中的毛发增多可能会带来健康问题,这是一个大问题! 不想家里弥漫着异味,特别是来自宠物便便的味道,所以需要一款能够处理…

打印100-200之间的素数

#include <stdio.h>int prime(int n){int i 1;for(i 2;i < n;i){if(n % i 0)return 0;}return 1; } //打印100-200之间的素数 int main() {int n 0;int j 100;for(j 100;j < 200;j){if(prime(j)){printf("%d是素数\n",j);n;}}printf("100-200…

【center-loss 中心损失函数】 原理及程序解释(更新中)

文章目录 前言问题引出open-set问题抛出 解决方法softmax函数、softmax-loss函数解决代码&#xff08;center_loss.py&#xff09;原理程序解释 代码运用 如何梯度更新首先了解一下基本的梯度下降算法然后 补充&#xff1a;外围知识模型 前言 学习一下&#xff1a; 中心损失函…