【C++】递归,搜索与回溯算法入门介绍和专题一讲解

这篇具有很好参考价值的文章主要介绍了【C++】递归,搜索与回溯算法入门介绍和专题一讲解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

【C++】递归,搜索与回溯算法入门介绍和专题一讲解,递归+搜索+回溯算法专题,算法,c++,深度优先,dfs
【C++】递归,搜索与回溯算法入门介绍和专题一讲解,递归+搜索+回溯算法专题,算法,c++,深度优先,dfs

个人主页:🍝在肯德基吃麻辣烫
我的gitee:C++仓库
个人专栏:C++专栏

前言

从本文开始进入递归,搜索与回溯算法专题讲解。



一、名词解释

1、什么是递归?

递归就是函数自己调用自己。


2、为什么会用到递归?

递归的本质是:

主问题:—>相同的子问题
子问题:—>相同的子问题

3、如何理解递归?

通过:

  • 1)通过递归的细节展开图(前期可以,过了前期一定不能再用了)
  • 2)通过二叉树中的题目
  • 3)宏观看待递归问题(重要)

越往后学越发现,如果只抓住递归的细节展开图,你会发现你根本就学不好递归这个东西,递归的细节展开图只是为了辅助你读过新手期,如果你后面还在用它,那么你往往是学不好递归的。

那么:如何理解宏观看待递归问题这个点呢?

可以分为几个部分:

    • 1)不要再在意递归的细节展开图
    • 2)把递归的函数当成一个黑盒子
    • 3)相信这个黑盒子一定能完成这个任务

4、如何写好递归?

写好一个递归也分为三点:

  • 1)先找到相同的子问题(函数头的设计)
  • 2)只关心某一个子问题是如何解决的(函数体的书写)
  • 3)递归出口

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

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

其实,一句话就能概括下来:
遍历是形式,搜索是目的。

所以,我们平时说的深度优先遍历和深度优先搜索,其实他们俩是一样的。
都可以叫做dfs

2、宽度优先遍历vs宽度优先搜索

其实,一句话就能概括下来:
遍历是形式,搜索是目的。

所以,我们平时说的宽度优先遍历和宽度优先搜索,其实他们俩是一样的。
都可以叫做bfs

3、关系图

我们所说的搜索,其实就是暴搜。
【C++】递归,搜索与回溯算法入门介绍和专题一讲解,递归+搜索+回溯算法专题,算法,c++,深度优先,dfs

4. 搜索问题的拓展

我们刚开始学习搜索时,总以为dfsbfs这两个搜索都只与二叉树有关。其实不然。
从下面的例题开始你会发现,很多东西都能使用dfs进行求解。

三、回溯与剪枝

这两个名词听起来貌似很高大上,其实用一个例子就能解释清楚了。

下面来看一个迷宫问题:

【C++】递归,搜索与回溯算法入门介绍和专题一讲解,递归+搜索+回溯算法专题,算法,c++,深度优先,dfs

入口和出口如上:我们从入口出发,往右边走遇到墙壁之后,往下走。走到蓝色标记,也就是拐角点的地方后,这就是一个岔路口,此时我们有两种选择:

  • 1)往左边走
  • 2)往右边走

当我们选择往左边走时,如下图:
【C++】递归,搜索与回溯算法入门介绍和专题一讲解,递归+搜索+回溯算法专题,算法,c++,深度优先,dfs
会遇到墙壁,此时我们就需要原路返回

这个从某一位置出发,一条道走到黑,再沿着原路返回的过程,就叫做回溯

回溯的这条路径,我们用绿色来标记。
【C++】递归,搜索与回溯算法入门介绍和专题一讲解,递归+搜索+回溯算法专题,算法,c++,深度优先,dfs
此时又走到了蓝色拐点,在这个岔路口我们有三种选择:
1)往上走
2)往左走
3)往右走

可是,我们最初是从上面下来的,然后沿着左边走,走不通之后再返回来的。
所以,我们只有一个选择:往右走。

而这个判断的过程,也就是选择路径的过程,就叫做剪枝。

将往上走的路径剪掉,将往左走的路径剪掉,就是剪枝。

四、专题一

1. 汉诺塔问题

点我直达

【C++】递归,搜索与回溯算法入门介绍和专题一讲解,递归+搜索+回溯算法专题,算法,c++,深度优先,dfs

算法分析

1.找到相同的子问题:


当n = 1时:

【C++】递归,搜索与回溯算法入门介绍和专题一讲解,递归+搜索+回溯算法专题,算法,c++,深度优先,dfs

直接将盘子从A柱子挪到C柱子即可。


当n = 2 时

【C++】递归,搜索与回溯算法入门介绍和专题一讲解,递归+搜索+回溯算法专题,算法,c++,深度优先,dfs
分为三步走:

1)我们需要将盘子a上面的盘子借助C柱子移动到B柱子。
【C++】递归,搜索与回溯算法入门介绍和专题一讲解,递归+搜索+回溯算法专题,算法,c++,深度优先,dfs

2)将a盘子移动到C柱子上
【C++】递归,搜索与回溯算法入门介绍和专题一讲解,递归+搜索+回溯算法专题,算法,c++,深度优先,dfs
3)将B柱子上的所有盘子借助A盘子移动到C柱子上。

【C++】递归,搜索与回溯算法入门介绍和专题一讲解,递归+搜索+回溯算法专题,算法,c++,深度优先,dfs


当n = 3 时
【C++】递归,搜索与回溯算法入门介绍和专题一讲解,递归+搜索+回溯算法专题,算法,c++,深度优先,dfs

与第二步相同:
分为三步走
1)将a盘子上面的所有盘子借助C柱子移动到B柱子上。
【C++】递归,搜索与回溯算法入门介绍和专题一讲解,递归+搜索+回溯算法专题,算法,c++,深度优先,dfs

2)将a盘子移动到C柱子上。
【C++】递归,搜索与回溯算法入门介绍和专题一讲解,递归+搜索+回溯算法专题,算法,c++,深度优先,dfs

3)将B柱子上面的所有盘子借助A柱子移动到C柱子上。

【C++】递归,搜索与回溯算法入门介绍和专题一讲解,递归+搜索+回溯算法专题,算法,c++,深度优先,dfs

2.只关心某一个子问题如何解决。

所以我们会发现,当n >= 2时,都会执行相同的子问题的操作。操作如下:

  • 1)将a盘子上面的所有盘子通过C柱子挪到B柱子上。
  • 2)将a盘子挪到C盘子上。
  • 3)将B柱子上面的所有盘子挪到C柱子上。

在这整个过程中,你要相信一件事情:
你交给dfs这个函数的任务是:

我要把所有盘子全部借助一个柱子挪到另一个柱子上。

并且要相信dfs这个函数一定能完成这个任务。

这就是宏观看待问题的思路。

3.递归出口
递归出口就是当n = 1时,你会发现跟当n = 其他数的操作步骤是不一样的。
当n = 1时,直接将a盘子移动到C柱子即可。

代码编写

class Solution {
public:
//1.重复的子问题(函数头)
//要将A柱子上面的所有盘子借助B柱子全部转移到C柱子上面

//2.只关心某一个子问题在做什么(函数体)

//3.递归出口

    void dfs(vector<int>& A, vector<int>& B, vector<int>& C,int n) 
    {
        if(n == 1)
        {
            C.push_back(A.back());
            A.pop_back();
            return;
        }

        dfs(A,C,B,n-1);
        C.push_back(A.back());
        A.pop_back();
        dfs(B,A,C,n-1);
    }
    void hanota(vector<int>& A, vector<int>& B, vector<int>& C) 
    {
        int n = A.size();
        dfs(A,B,C,n);
    }
};

总结

提示:这里对文章进行总结:

本文章详细讲解了递归,搜索与回溯算法的入门理解级操作,以及通过一道例题感受一下dfs这种算法的强大之处,关键在于dfs写起来特别简单。

学好dfs,是进入大厂的必备技能。文章来源地址https://www.toymoban.com/news/detail-705211.html

到了这里,关于【C++】递归,搜索与回溯算法入门介绍和专题一讲解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 专题二:二叉树的深搜【递归、搜索、回溯】

    深度优先遍历 (DFS,全称为DepthFirstTraversal),是我们树或者图这样的数据结构中常用的⼀种遍历算法。这个算法会尽可能深的搜索树或者图的分⽀,直到⼀条路径上的所有节点都被遍历完毕,然后再回溯到上⼀层,继续找⼀条路遍历。 在⼆叉树中,常⻅的深度优先遍历为:

    2024年02月07日
    浏览(41)
  • 【算法系列篇】递归、搜索和回溯(二)

    前面为大家介绍了关于递归的知识,以及使用递归解决了几个问题,那么这篇文章将带大家巩固一下关于递归的知识。 https://leetcode.cn/problems/swap-nodes-in-pairs/description/ 给你一个链表,两两交换其中相邻的节点,并返回交换后链表的头节点。 你必须在不修改节点内部的值的情况

    2024年02月05日
    浏览(41)
  • 【算法系列篇】递归、搜索与回溯(一)

    递归算法是一种通过重复将问题分解为同类的子问题而解决问题的方法。递归式方法可以被用于解决很多的计算机科学问题,因此它是计算机科学中十分重要的一个概念。绝大多数编程语言支持函数的自调用,在这些语言中函数可以通过调用自身来进行递归。 搜索算法是利用

    2024年02月04日
    浏览(49)
  • 【算法系列篇】递归、搜索和回溯(三)

    前面我已经给大家分享了两篇关于递归、搜索和回溯相关的问题,但是前面两篇只涉及到了递归,搜索和回溯基本还没涉及到,大家先别着急,后面的文章会为大家分享关于搜索和回溯相关的知识和题目。今天这篇文章主要涉及到的就是关于在递归过程中的剪枝问题。 二叉树

    2024年02月04日
    浏览(40)
  • 【算法系列篇】递归、搜索和回溯(四)

    前面我们通过几个题目基本了解了解决递归类问题的基本思路和步骤,相信大家对于递归多多少少有了更加深入的了解。那么本篇文章我将为大家分享结合决策树来解决递归、搜索和回溯相关的问题。 决策树是一种基本的分类与回归方法。在分类问题中,决策树通过构建一棵

    2024年02月04日
    浏览(49)
  • 【算法】递归、回溯、剪枝、dfs 算法题练习(组合、排列、总和问题;C++)

    后面的练习是接着下面链接中的文章所继续的,在对后面的题练习之前,可以先将下面的的文章进行了解👇: 【算法】{画决策树 + dfs + 递归 + 回溯 + 剪枝} 解决排列、子集问题(C++) 思路 题意分析 :要求根据给出的数字,算出合法的括号组成个数。根据题目,我们可以总

    2024年02月22日
    浏览(50)
  • DSt:数据结构的最强学习路线之数据结构知识讲解与刷题平台、刷题集合、问题为导向的十大类刷题算法(数组和字符串、栈和队列、二叉树、堆实现、图、哈希表、排序和搜索、动态规划/回溯法/递归/贪心/分治)总

    Algorithm:【算法进阶之路】之算法面试刷题集合—数据结构知识和算法刷题及其平台、问题为导向的十大类刷题算法(数组和字符串、链表、栈和队列、二叉树、堆、图、哈希表、排序和搜索、回溯算法、枚举/递归/分治/动态规划/贪心算法)总结 目录 相关文章

    2024年02月08日
    浏览(56)
  • 递归专题训练详解(回溯,剪枝,深度优先)

    在经典汉诺塔问题中,有 3 根柱子及 N 个不同大小的穿孔圆盘,盘子可以滑入任意一根柱子。一开始,所有盘子自上而下按升序依次套在第一根柱子上(即每一个盘子只能放在更大的盘子上面)。移动圆盘时受到以下限制: (1) 每次只能移动一个盘子; (2) 盘子只能从柱子顶端滑出

    2024年02月07日
    浏览(47)
  • c++详解递归算法-全网最全+例题讲解

    什么是递归? 递归的思想是什么? 什么时候该用递归? 使用递归需要注意哪些问题? 递归思想解决经典问题 递归和循环的区别是什么? 递归算法: 定义:直接或间接地出现对自身的调用 本质:递归即 递进 与 回归, 基本思想就是把规模大的问题转化为规模小的相似的子

    2024年02月07日
    浏览(38)
  • 递归回溯两个例题:1.数组组合 2.在矩阵中搜索单词

    题目1:组合 给定两个整数 n 和 k ,返回范围 [1, n] 中所有可能的 k 个数的组合。 你可以按 任何顺序 返回答案。 输入:n = 4, k = 2 输出: [   [2,4],   [3,4],   [2,3],   [1,2],   [1,3],   [1,4], ]  解题思路: 1.定义一个temp数组,存放临时的组合结果 2.两种选择:1.选择当前元素2.不选

    2024年02月15日
    浏览(43)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包