码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 【递归、搜索与回溯算法】第一节.初识递归、搜索与回溯算法


    作者简介:大家好,我是未央;

    博客首页:未央.303

    系列专栏:递归、搜索与回溯算法

    每日一句:人的一生,可以有所作为的时机只有一次,那就是现在!!!!!

    文章目录

    前言

    一、递归算法

    1.1 什么是递归?

    1.2 为什么会用到递归?

    1.3 如何理解递归?

    1.4 如何写好一个递归?

    二、搜索算法

    2.1 深度优先遍历vs深度优先搜索

    2.2 宽度优先遍历vs宽度优先搜索

    2.3 扩展搜索问题 

    三、回溯算法

    总结



    前言

    今天我们将进入到递归,搜索,回溯算法,这些算法在我们笔试中非常重要,必须要熟练掌握,本节内容主要带着认识一下这些算法,了解其本质,后面会有很多例题来巩固这些算法!!!!


    一、递归算法

    1.1 什么是递归?

    我们要学会递归算法的使用,首先要了解它是什么,才能更好的掌握和使用它。

    简而言之,递归:函数自己调用自己的情况;直到碰到终止条件,返回结果的过程。


    递归可以看作两个过程,分别是递和归。

    递就是原问题把要计算的结果传给子问题;

    归则是子问题求出结果后,把结果层层返回原问题的过程。


    1.2 为什么会用到递归?

    递归的本质:

    即主问题可以推出与主问题相同的子问题;

    而子问题又可以继续推出与子问题相同的子子问题;


    实例图示说明:

    (1)二叉树的遍历:

    (2)快速排序算法

    (3)归并排序算法


    1.3 如何理解递归?

    第一步:递归展开细节图;

    归并排序举例:

    递归展开图(int arr[] = { 7,5,6,3,9,8,2,1,4,5 };)


    第二步:二叉树的递归;

    二叉树递归举例:

    先简单的定义一个 二叉树;

    像这样的二叉树: 


    第三步:宏观看待递归过程(重要)

    (1)不要在意递归的细节展开图;

    (2)把递归当成一个黑盒;

    (3)相信这个黑盒一定能完成这个任务;


    1.4 如何写好一个递归?

    第一步:

    先找一下是否有和主问题相同的子问题!!!!!----->  关系到函数头的设计;


    第二步:

    只需要关心某一个子问题是如何解决即可!!!!-----> 关系到函数体的书写;


    第三步:

    最后再注意一下递归函数的出口即可;


    代码示例说明:

    (1)二叉树的递归:

    代码实现:

    1. //二叉树的后续遍历
    2. void dfs(TreeNode* root){
    3. //递归的返回条件
    4. if(root == null)
    5. return;
    6. //先递归遍历左子树
    7. dfs(root.left);
    8. //再递归遍历右子树
    9. dfs(root.right);
    10. //最后遍历根结点
    11. printf(root.value);
    12. }

    (2)归并排序:

    代码实现:

    1. void merge(nums,int left,int right){
    2. //细节:出口;
    3. if(left >= right){
    4. int mid = (left+right)/2;
    5. merge(nums,left,mid);
    6. merge(nums,mid+1,right);
    7. //合并两个有序数组
    8. }

    二、搜索算法

    2.1 深度优先遍历vs深度优先搜索

    深度优先遍历(深度优先搜索):一条路走到黑,走到不能继续走的时候就返回;

    两者实际是一样的概念;而不同的是:

    遍历是形式;搜索是目的;

    图示说明:


    2.2 宽度优先遍历vs宽度优先搜索

    宽度优先遍历(深度优先搜索):又叫层次遍历,从上往下对每一层依次访问,在每一层中,从左往右(也可以从右往左)访问结点,访问完一层就进入下一层,直到没有结点可以访问为止。

    两者实际是一样的概念;而不同的是:

    遍历是形式;搜索是目的;


    图示说明:


    2.3 扩展搜索问题 

    搜索方式,不仅仅局限于二叉树,图类等;还可以对于一些全排列,如果列举问题能用决策树的图示表示出来,依然可以用搜索来解决问题;


    三、回溯算法

    回溯算法定义:

    回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。一个典型的应用是走迷宫问题,当我们走一个迷宫时,如果无路可走了,那么我们就可以退一步,再在其他的路上尝试一步,如果还是无路可走,那么就再退一步,尝试新的路,直到走到终点或者退回到原点。


    回溯的本质:回溯的本质就是深搜;

    图示说明:

    总结

  • 相关阅读:
    gateway整合sentinel限流
    TypeError: ‘module‘ object is not callable 报错解决
    k8s-实战——Harbor镜像仓库的部署
    【Python】不是内部或外部命令,cmd指令报错,path环境配置
    GAMES101复习:光线追踪(Ray Tracing)
    【21天学习挑战赛】顺序查找和二分查找的小总结
    vue3基础(三)组件命名及调用,render,render中获取插槽值,函数式组件,异步组件,vue3中data只有函数形式
    年初离职,学习半年源码,终于拿到了蚂蚁Offer,分享面试过程
    回归测试?
    Solidity 小白教程:5. 变量数据存储和作用域 storage_memory_calldata
  • 原文地址:https://blog.csdn.net/qq_64861334/article/details/133906116
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号