【递归】1.汉诺塔问题

news2024/12/26 0:17:17

在这里插入图片描述

面试题 08.06. 汉诺塔问题
leetcode链接:https://leetcode.cn/problems/hanota-lcci/description/

在经典汉诺塔问题中,有 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]
提示:

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

本文章主要围绕两个问题来展开:
1.为什么汉诺塔问题能使用递归?
2.如何解决汉诺塔问题?

为什么汉诺塔问题能使用递归?

可以使用递归的题目,可以总结为一句话:
解决大问题,可以使用相同类型的子问题

解决子问题 ,可以使用相同类型的子问题

我们来对汉诺塔问题进行分析:
当N = 1时,移动的策略:
直接将A中的盘子转移到C中
在这里插入图片描述

当N = 2时,移动的策略:
1.将A上面的第一个盘子移动到B上,
2.将A上面的第二个盘子移动到C上
3.将B上面的盘子移动到C上
在这里插入图片描述
当N = 3时,移动的策略:
1.将A上面的第一个盘子移动到C上
2.将A上面的第二个盘子移动到B上
3.将C上面的第一个盘子移动到B上

4.将A上面的第一个盘子移动到C上

5.将B上面的第一个盘子移动到A上
6.将B上面的第二个盘子移动到C上
7.将A上面的第一个盘子移动到C上

在这里插入图片描述

通过上面的演示,可以得到什么?
下面的三步
1.将A上面的第一个盘子移动到C上
2.将A上面的第二个盘子移动到B上
3.将C上面的第一个盘子移动到B上

N = 3时,前面的三步就是将A中的N-1个盘子借助C移动到B上,而这个操作,就是和N = 2时一模一样的。

而下面的这三步,
5.将B上面的第一个盘子移动到A上
6.将B上面的第二个盘子移动到C上
7.将A上面的第一个盘子移动到C上

N = 3时,这三步就是将B中的N-1个盘子借助A移动到C上,而这个操作,就是和N = 2时一模一样的。

因此,本问题的流程就抽象成什么了?
当解决N = 3时,可以用N = 2的策略 --> 当解决N个盘子的问题时,可以使用N - 1个盘子的策略。

而我前面提到的递归的本质:
解决大问题,可以使用相同类型的子问题

解决子问题 ,可以使用相同类型的子问题

如何写递归的代码??

写递归的代码,需要三个部分:

1.挖掘出重复的子问题  --> 函数头

2.只关心某一个子问题在做什么  --> 函数体

3.递归的出口 --> 防止死递归

1.挖掘出重复的子问题 --> 函数头

根据前面提到的n = 3时如何转化子问题的内容,将流程抽象出来,就变成了:
N = 3时,

第一步:将A中的N - 1个盘子借助C转移到B上 (重复的子问题)
第二步:将A中的最后一个盘子转移到C上
第三步: 将B中的N - 1个盘子借助A转移到C上 (重复的子问题)

我们根据重复的子问题设计出函数头。
从上面可以发现,有4个参数,分别是A,B,C和盘子的数量N
因此,函数头设计为:
在这里插入图片描述

2.只关心某一个子问题在做什么 --> 函数体

N = 3时,

第一步:将A中的N - 1个盘子借助C转移到B上 (重复的子问题)
第二步:将A中的最后一个盘子转移到C上
第三步: 将B中的N - 1个盘子借助A转移到C上 (重复的子问题)

在这里插入图片描述
我们要从宏观去思考,不要思考dfs如何实现这个任务,把自己当成领导,相信dfs一定能完成你布置的任务。

给dfs布置要给任务,相信dfs一定能完成任务 。

3.递归的出口 --> 防止死递归

n = 1时,不需要借助其他盘子,直接将A上的盘子转移到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)
        {
            //直接将a中的盘子转移到c上
            c.push_back(a.back());
            a.pop_back();
            return;
        }

        //当有n个盘子的时候
        dfs(a, c, b, n - 1);   //将a中的n-1个盘子,借助c,转移到b上

        //将a中的最后一个盘子转移到c上
        c.push_back(a.back());
        a.pop_back();

        //将b中的n-1个盘子,借助a,转移到c上
        dfs(b, a, c, n - 1);
    }
};

总结

1.什么问题能使用递归?
解决大问题,可以使用相同类型的子问题

解决子问题 ,可以使用相同类型的子问题
2.如果要写递归,需要哪几步?

第一步:挖掘出相同的子问题  (关系到具体函数头的设计
第二步:只关心具体子问题做了什么  (关系到具体函数体怎么写,是一个宏观的过程)
第三步:找到递归的出口,防止死递归  (关系到如何跳出递归)

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

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

相关文章

WMS如何实现与TMS的双向信息流?

要实现仓储管理系统&#xff08;WMS&#xff09;与运输管理系统&#xff08;TMS&#xff09;之间的双向信息流&#xff0c;可以通过以下几个步骤进行集成&#xff1a; —————————————————— 1、需求分析&#xff1a; 1):确定WMS和TMS之间需要传输的数据类型&…

“小巨人”『南斗六星』×企企通,携手推动华中地区智能网联企业供应链数字化发展

近日&#xff0c;湖北省知名“小巨人”企业——南斗六星系统集成有限公司&#xff08;以下简称“南斗六星”&#xff09;与企企通达成合作&#xff0c;并成功召开数字化建设项目启动会议。 由南斗六星总经理带头的各部门骨干&#xff0c;以及企企通华中区负责人、项目负责人等一…

小白零基础学数学建模应用系列(二):基于Python的共享单车系统建模与仿真分析

共享单车系统作为一种绿色环保的出行方式&#xff0c;已成为现代城市公共交通的重要组成部分。本文将使用Python编程语言&#xff0c;并结合modsim库&#xff0c;构建并仿真一个共享单车系统的模型&#xff0c;通过这一过程来展示如何进行系统的建模与分析。 文章目录 一、背景…

大厂面试题分享第二期

大厂面试题分享第二期 如果执行了一条命令&#xff0c;"select count(*)from…"&#xff0c;使用哪个引擎更快&#xff0c;为什么&#xff1f;垃圾回收器 CMS 和 G1的区别介绍一下CMS和G1CMS&#xff08;并发&#xff09;垃圾收集器G1垃圾回收器 HTTPS和HTTP的区别主…

网站谷歌SEO优化要注意什么?

就最近我们接触的客户而言&#xff0c;有不少客户连最基本的seo常识都没有&#xff0c;他们固然可能是技术大咖&#xff0c;但如果你还是期望从谷歌seo获取流量&#xff0c;那么&#xff0c;最基本的源代码输出必须要有&#xff0c;正常情况下&#xff0c;整个页面除了动画交互…

windows10和linux(debian12)设置静态ip————附带详细过程

文章目录 0 背景1 linux&#xff08;debian&#xff09;1.1 查看网络配置1.2 获取ip动态分配下的配置1.3 打开网络配置文件1.4 重新启动网络服务1.5 验证设置 2 windows2.1 查看自动获取ip地址下的配置2.2 进行设置 0 背景 因为下位机只能获取固定的ip&#xff08;ip池很小&am…

递归 与 dfs 综合练习(一)

目录 一、找出所有子集的异或总和再求和 1.题目链接&#xff1a;1863. 找出所有子集的异或总和再求和 2.题目描述&#xff1a; 3.解法&#xff08;递归&#xff09; &#x1f335;算法思路&#xff1a; &#x1f335;算法代码&#xff1a; 二、全排列 II 1.题目链接&…

“低代码技术:数字化工厂的加速器与智能制造的桥梁“

引言 随着工业4.0和智能制造的快速发展&#xff0c;数字化工厂成为了现代制造业的核心概念。这一转型不仅依赖于物联网、人工智能、大数据等新兴技术&#xff0c;也需要软件开发的支持。然而&#xff0c;传统的软件开发模式由于其复杂性和周期长&#xff0c;难以快速适应数字化…

案例-华东某财险公司:引入监控易一体化运维软件

在华东这片经济活跃、金融繁荣的热土上&#xff0c;某财险公司作为行业内的佼佼者&#xff0c;始终致力于通过科技创新提升业务运营效率与服务品质。随着公司业务规模的不断扩大&#xff0c;IT基础设施的复杂性和重要性日益凸显&#xff0c;如何实现对庞大IT基础资源的实时监控…

从概念到现实:手机设计可视化如何重塑科技美学

在这个日新月异的数字时代&#xff0c;手机已不仅仅是通讯工具&#xff0c;它更是我们生活方式的延伸&#xff0c;是连接世界的窗口&#xff0c;是创意与科技的完美结晶。 想象一下&#xff0c;在浩瀚的数字海洋中&#xff0c;一款尚未面世的手机&#xff0c;通过高精度的3D建模…

在亚马逊云科技上安全、合规、私密地调用生成式AI大模型

项目简介&#xff1a; 小李哥将继续每天介绍一个基于亚马逊云科技AWS云计算平台的全球前沿AI技术解决方案&#xff0c;帮助大家快速了解国际上最热门的云计算平台亚马逊云科技AWS AI最佳实践&#xff0c;并应用到自己的日常工作里。 本次介绍的是如何安全、合规、私密地调用亚…

2024最全最新VMWare以及Linux配置(含yum失效解决方案)

血泪教训浓缩的精华配置、报错解决&#xff08;解决99%问题&#xff09; 目录 1.Linux环境搭建 1.1安装VMWare 1.1.1卸载老版本VMWare&#xff08;如果有的话&#xff09; 1.1.2开始安装VMware 1.2创建虚拟机 1.3安装Centos7 1.4设置虚拟机快照 1.5安装远程连接SSH客户…

AI换脸模型(384-448模型430万底丹)

模型训练素材19万张来自于 1、香港中文大学CelebA预训练集-WF512版-量大角度全-11万5千张 2、DST全角度训练图集V3.1 WF512【2.6W张 6GB 】 3、女性人脸数据&#xff0c;预训练炼丹专用 4、补全SRC极限角度 5、全角度512分辨率7万张素材 下载地址&#xff1a; 链接&#xf…

day09——集合ArrayList

ArrayList类 ArrayList表示一种集合&#xff0c;它是一个容器&#xff0c;用来存储数据的&#xff0c;类似于数组。但不同于数组&#xff0c;数组一旦创建大小不变&#xff0c;而集合大小是可变的。 ArrayList常用方法 ArrayList是泛型类&#xff0c;可以约束存储的数据类型…

TLE8386-2EL:汽车级DC-DC转换器中文资料书

描述 TLE8386-2EL是一款具有内置保护功能的低端感应升压控制器。该器件的主要功能是将输入电压升高&#xff08;升压&#xff09;到更大的输出电压。开关频率可从100kHz调整至700kHz&#xff0c;并可与外部时钟源同步。 TLE8386-2EL的独特功能可将关断电流消耗降至 <2μA。该…

Python 如何进行静态代码分析(pylint, flake8)

Python 的静态代码分析是一种在不执行代码的情况下&#xff0c;对代码进行检查的技术。其主要目的是在代码运行前发现潜在的错误、风格问题以及其他代码质量问题。静态代码分析在提高代码的可维护性、可读性和可靠性方面发挥着重要作用。常用的静态代码分析工具包括 Pylint 和 …

观测云突变告警,精准预测云原生的系统异常

背景 观测云 DataKit 是一个强大的数据采集工具&#xff0c;能够收集和监控容器化环境和 Kubernetes 集群的指标、对象和日志数据。通过灵活使用 DataKit 收集的数据&#xff0c;可以对 Kubernetes 集群进行深入的监控和分析&#xff0c;从而实现更好的运维和优化。以下是一些…

如何使用yolov5-master进行训练

主要记录配置完成的yolov5-master如何进行自定义数据集训练。 本人使用的设备是jetson-orin AGX&#xff0c;系统是英伟达官方魔改过的ubuntu18.04.。 一、修改配置 首先观察train.py的__main__部分&#xff0c;我们发现训练程序接受很多个参数。 其中我们必须要关注的参数包括…

【网络编程】UDP实现网络通信(C语言、Ubuntu实现)

代码实现&#xff1a;分为udpSer.c(服务器端)和udpCli.c(客户端) //udpSer.c #include <myhead.h>#define SER_PORT 9999 #define SER_IP "192.168.83.128"int main(int argc, const char *argv[]) {//1、创建用于通信的服务器套接字文件描述符int sfd sock…

AI大模型学习之白话笔记(三) -- Assistants API入门

经过上面两篇文章的学习&#xff0c;恭喜你开始进入了人工智能的世界&#xff01;在这篇文章中&#xff0c;你将跟我一起学习如何使用Assistants API快速构建一个针对特定领域的人工智能助手。 我们从基础开始&#xff0c;一步步带你用Assistants API完成一个应用的整个过程。…