递归搜索与回溯算法

递归搜索与回溯算法

在这里插入图片描述

名词解释

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

递归

在解决⼀个规模为n的问题时,如果满⾜以下条件,我们可以使⽤递归来解决:

a. 问题可以被划分为规模更⼩的⼦问题,并且这些⼦问题具有与原问题相同的解决⽅法。

b. 当我们知道规模更⼩的⼦问题(规模为n-1)的解时,我们可以直接计算出规模为n的问题 的解。

c. 存在⼀种简单情况,或者说当问题的规模⾜够⼩时,我们可以直接求解问题。

⼀般的递归求解过程如下:

a. 验证是否满⾜简单情况。

b. 假设较⼩规模的问题已经解决,解决当前问题。

汉诺塔问题

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

请编写程序,用栈将所有盘子从第一根柱子移到最后一根柱子。

你需要原地修改栈。

示例1:

 输入:A = [2, 1, 0], B = [], C = []输出:C = [2, 1, 0]

示例2:

 输入:A = [1, 0], B = [], C = []输出:C = [1, 0]

提示:

  1. A中盘子的数目不大于14个。

解法(递归):

算法思路:

这是⼀道递归⽅法的经典题⽬,我们可以先从最简单的情况考虑:

  • 假设n=1,只有⼀个盘⼦,很简单,直接把它从A中拿出来,移到C上;
  • 如果n=2呢?这时候我们就要借助B了,因为⼩盘⼦必须时刻都在⼤盘⼦上⾯,共需要3步(为 了⽅便叙述,记A中的盘⼦从上到下为1号,2号):

a. 1号盘⼦放到B上;

b. 2号盘⼦放到C上;

c. 1号盘⼦放到C上。

⾄此,C中的盘⼦从上到下为1号,2号。

  • 如果n>2呢?这是我们需要⽤到n=2时的策略,将A上⾯的两个盘⼦挪到B上,再将最⼤的盘 ⼦挪到C上,最后将B上的⼩盘⼦挪到C上就完成了所有步骤。

因为A中最后处理的是最⼤的盘⼦,所以在移动过程中不存在⼤盘⼦在⼩盘⼦上⾯的情况。

则本题可以被解释为:

  1. 对于规模为n的问题,我们需要将A柱上的n个盘⼦移动到C柱上。

  2. 规模为n的问题可以被拆分为规模为n-1的⼦问题:

    a. 将A柱上的上⾯n-1个盘⼦移动到B柱上。

    b. 将A柱上的最⼤盘⼦移动到C柱上,然后将B柱上的n-1个盘⼦移动到C柱上。

  3. 当问题的规模变为n=1时,即只有⼀个盘⼦时,我们可以直接将其从A柱移动到C柱.

  • 需要注意的是,步骤2.b考虑的是总体问题中的⼦问题b情况。在处理⼦问题的⼦问题b时,我们 应该将A柱中的最上⾯的盘⼦移动到C柱,然后再将B柱上的盘⼦移动到C柱。在处理总体问题 的⼦问题b时,A柱中的最⼤盘⼦仍然是最上⾯的盘⼦,因此这种做法是通⽤的。

算法流程:

递归函数设计:void dfs(vector&A,vector&B,vector&C,int n)

  1. 返回值:⽆;
  2. 参数:三个柱⼦上的盘⼦,当前需要处理的盘⼦个数(当前问题规模)。
  3. 函数作⽤:将A中的上⾯n个盘⼦挪到C中。

递归函数流程:

  1. 当前问题规模为n=1时,直接将A中的最上⾯盘⼦挪到C中并返回;
  2. 递归将A中最上⾯的n-1个盘⼦挪到B中;
  3. 将A中最上⾯的⼀个盘⼦挪到C中;
  4. 将B中上⾯n-1个盘⼦挪到C中。

在这里插入图片描述
在这里插入图片描述

代码如下:

class Solution 
{
public:void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {dfs(A,B,C,A.size());}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);}
};

在这里插入图片描述

合并两个有序链表

将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。

示例 1:

在这里插入图片描述

输入:l1 = [1,2,4], l2 = [1,3,4]
输出:[1,1,2,3,4,4]

示例 2:

输入:l1 = [], l2 = []
输出:[]

示例 3:

输入:l1 = [], l2 = [0]
输出:[0]

在这里插入图片描述

在这里插入图片描述

解法(递归):

算法思路:

  1. 递归函数的含义:交给你两个链表的头结点,你帮我把它们合并起来,并且返回合并后的头结点;

  2. 函数体:选择两个头结点中较⼩的结点作为最终合并后的头结点,然后将剩下的链表交给递归函数 去处理;

  3. 递归出⼝:当某⼀个链表为空的时候,返回另外⼀个链表。

代码如下:

/*** Definition for singly-linked list.* struct ListNode {*     int val;*     ListNode *next;*     ListNode() : val(0), next(nullptr) {}*     ListNode(int x) : val(x), next(nullptr) {}*     ListNode(int x, ListNode *next) : val(x), next(next) {}* };*/
class Solution 
{
public:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {if(list1==nullptr) return list2;if(list2==nullptr) return list1;if(list1->val<list2->val){list1->next=mergeTwoLists(list1->next,list2);return list1;}else{list2->next=mergeTwoLists(list1,list2->next);return list2;}}};

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

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

相关文章

基于java+SpringBoot+Vue的中小型医院网站设计与实现

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; Springboot mybatis Maven mysql5.7或8.0等等组成&#x…

图神经网络研究综述(GNN),非常详细收藏我这一篇就够了!

图神经网络由于其在处理非欧空间数据和复杂特征方面的优势&#xff0c;受到广泛关注并应用于推荐系统、知识图谱、交通道路分析等场景。 大规模图结构的不规则性、节点特征的复杂性以及训练样本的依赖性给图神经网络模型的计算效率、内存管理以及分布式系统中的通信开销带来巨…

36.安卓逆向-壳-脱壳实战

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a;图灵Python学院 本人写的内容纯属胡编乱造&#xff0c;全都是合成造假&#xff0c;仅仅只是为了娱乐&#xff0c;请不要盲目相信。第一…

办公耗材管理新纪元:系统化解企业挑战,助力高效运营

在当今竞争激烈的商业环境中&#xff0c;无论是大型企业还是中小型企业&#xff0c;办公耗材管理都是关乎企业运营效率与成本控制的关键环节。有效的办公耗材管理不仅能显著降低运营成本&#xff0c;还能提升整体工作效率&#xff0c;确保业务的顺畅进行。然而&#xff0c;许多…

2、 家庭网络发展现状

上一篇我们讲了了解家庭网络历史(https://blog.csdn.net/xld_hung/article/details/143639618?spm1001.2014.3001.5502),感兴趣的同学可以看对应的文章&#xff0c;本章我们主要讲家庭网络发展现状。 关于家庭网络发展现状&#xff0c;我们会从国内大户型和小户型的网络说起&…

时序论文20|ICLR20 可解释时间序列预测N-BEATS

论文标题&#xff1a;N-BEATS N EURAL BASIS EXPANSION ANALYSIS FOR INTERPRETABLE TIME SERIES FORECASTING 论文链接&#xff1a;https://arxiv.org/pdf/1905.10437.pdf 前言 为什么时间序列可解释很重要&#xff1f;时间序列的可解释性是确保模型预测结果可靠、透明且易…

hadoop_capacity-scheduler.xml

hadoop3.2.3capacity-scheduler.xml配置实例 <configuration><property><!-- 可以处于等待和运行状态的应用程序的最大数量 --><name>yarn.scheduler.capacity.maximum-applications</name><value>10000</value></property>&l…

小白必看:知识库搭建的详细拆解步骤

在当今信息爆炸的时代&#xff0c;企业知识库成为了企业积累、管理和分享知识的重要工具。对于初学者来说&#xff0c;搭建一个企业知识库可能看起来是一项复杂的任务&#xff0c;但通过以下步骤&#xff0c;即使是小白也能轻松上手。本文将详细拆解搭建企业知识库的步骤&#…

042 异步编排

文章目录 什么是异步Future异步编排1串行关系执行thenRunthenApplythenAcceptthenCompose 2聚合ANDthenCombinethenAcceptBothrunAfterBoth 3OR聚合applyToEiteracceptEitherrunAfterEither 4异常处理exceptionallywhenCompletehandle 异步开启1RunAsync:没有使用自定义线程池&…

【算法设计与分析】采用特征方程求解递归方程

文章目录 K阶常系数线性齐次递归方程K阶常系数线性【非】齐次递归方程例题例1&#xff1a;齐次无重根例2&#xff1a;齐次有重根例3&#xff1a;非齐次&#xff0c;g(n)是n的多项式例4&#xff1a;非齐次&#xff0c;g(n)是n的指数形式&#xff0c;a不是重根 练习其它求解递归方…

SAP ABAP开发学习——function alv复选框设置

1.关于报表复选框的创建 首先该报表要调用功能函数 这里参照SLIS_LAYOUT_ALV定义字段 参照来源 具体字段的定义 双击 双击这两个查看需要的字段 box_fieldname就是复选框 需要在内表定义需要的名称&#xff0c;这里使用‘BOX 相关内容完成

5.7 与 8.0 对相同文件的 LOAD DATA 语句结果不同

5.7 与 8.0 对相同文件的 LOAD DATA 语句结果不同 问题描述 某客户现场支持&#xff0c;由MySQL 5.7.21升级MySQL 8.0.25后&#xff0c;通过LOAD DATA导入文件&#xff0c;当同一会话连续导入不同的编码&#xff08;UTF8/GB18030&#xff09;文件时会出现乱码。数据库版本未升…

河南梦想城供配电项目-综合监控平台[智能运维+集中监控]

河南梦想城供配电项目-综合监控平台软件 可分为主机系统&#xff08;针对单个站房的实时监测&#xff09;和集中云平台&#xff08;针对多个站房的集中管理&#xff09;&#xff0c;可实现电气设备隐患预警&#xff0c;站房环境风险可控&#xff0c;系统与电力平台以IEC61850标…

每日计划-1114

完成 14. 最长公共前缀 #include <string> #include <vector>class Solution { public:string longestCommonPrefix(std::vector<std::string>& strs) {if (!strs.size()) {return "";}int length strs[0].size();int count strs.size();fo…

《深度学习》AlexNet网络

文章目录 1.AlexNet的网络架构2.示例&#xff1a;手写数字识别2.1 数据读取 学习目标&#xff1a; 知道AlexNet网络结构能够利用AlexNet完成图像分类 2012年&#xff0c;AlexNet横空出世&#xff0c;该模型的名字源于论⽂第⼀作者的姓名AlexKrizhevsky 。AlexNet使⽤了8层卷积…

嵌入式软件开发环境的搭建

1.ARM指令模拟器环境搭建 keil软件 KEIL是公司的名称&#xff0c;有时候也指KEIL公司的所有软件开发工具。2005年&#xff0c;Keil被ARM公司收购&#xff0c;成为 ARM的子公司之一。 MDK&#xff08;Microcontroller Development Kit&#xff09; &#xff0c;也称MDK-ARM、…

模型广场上线!一键开启免费体验

模型广场上新&#xff0c;多款模型任君挑选~ 限时免费体验&#xff01;快来开启你的AI创作之旅吧~ 01 comfyui 工作流 ComfyUI是一个基于Stable Diffusion开发的图形用户界面&#xff08;GUI&#xff09;&#xff0c;它将Stable Diffusion的流程拆分成节点&#xff0c;你能够…

Java的dto,和多表的调用

1理论 需求是新增菜品eg&#xff1a;菜名:豆腐脑&#xff1b;口味&#xff1a;甜口&#xff0c;咸口&#xff0c; 菜单表&#xff1a;dish&#xff1b;口味表dish_flavor&#xff1b; 1dto:数据传输对象 新建一个dishDto对象有两个表里的属性 2用到两个表&#xff0c;dish,d…

python爬虫js逆向进阶——请求的网页源码被加密,解密方法全过程(19)

文章目录 1、任务目标2、网页分析3、代码编写1、任务目标 目标网站:https://jzsc.mohurd.gov.cn/data/company,该网站的网页源码被加密了,用于本文测验 要求:解密该网站的网页源码,请求网站并返回解密后的明文数据,网页内容如下: 2、网页分析 进入网站,打开开发者模式,…

二、vue指令

1、v-bind ⽬标 : 给标签属性设置 vue 变量的值 vue 指令 , 实质上就是特殊的 html 标签属性 , 特点 : v- 开头 每个指令 , 都有独⽴的作⽤ 语法&#xff1a; v-bind:属性名"vue变量" 简写&#xff1a; : 属性名"vue变量" <!-- vue 指令 -v-bi…