汉诺塔问题(递归超详细)C++,leetcode

文章目录

  • 前言
  • 一、题目分析
  • 二、算法原理
    • 1.为什么要用递归
    • 2.如何编写代码
  • 三、代码实现
  • 总结


前言

在本文章中,我们将要详细介绍一下汉诺塔问题,本题目我们采用递归的方式解决相关的内容

一、题目分析

在这里插入图片描述
题目要求详解:
  🌟 有三个柱子假设名称分别为a,b,c,其中a柱子上有若干个盘子。
  🌟这些盘子按照从底往上大小依次减小的次序摆放。
  🌟不论盘子在哪个柱子上都必须要求下面盘子的大小都大于上面盘子的大小
  🌟将a柱子上的若干盘子通过b柱子按照要求转移到柱子上

二、算法原理

☀️ ☀️ 学过的小伙伴都知道这道题目可以用递归解决,那我们为什么要用递归算法解决,为什么不用贪心,动态规划等算法呢??

1.为什么要用递归

首先简单看一下递归:函数自己调用自己,将主问题分解为相同子问题,子问题又可以调用相同的子问题。

我们要有规律的放挪动盘子,每一步的意义是什么,同时注意不要分解的太过于细致

把每一步分析一下
🔱🔱n==1,直接可以把a柱子上的盘子放到c柱子上,不用借助b柱子就可以实现
在这里插入图片描述

🔱🔱n==2,题目要求我们把a柱子上的2个盘子通过b柱子转移到c柱子上。

  💗💗首先我们要把a柱子上的盘子挪到c柱子上,先想办法把a柱子上最下面那个最大的盘子挪到c柱子上,剩余的那一个才可以挪过去。
  💗💗要挪动a柱子上最大的盘子,得先把a柱子上那个小盘子挪走,那这个怎末挪动呢??
  💗💗我们发现这一步和n== 1时的情景非常类似。按照n==1的步骤,把那个小盘子直接挪到b柱子上。
  💗💗这时我们就可以把a柱子上最大的那个盘子挪到c柱子上了。
  💗💗最后把那个小盘子挪动c柱子上就可以了
在这里插入图片描述

🔱🔱n==3,题目要求我们把a柱子上的3个盘子通过b柱子转移到c柱子上。

  💗💗首先我们要把a柱子上的盘子挪到c柱子上,先想办法把a柱子上最下面那个最大的盘子挪到c柱子上,剩余的那俩个才可以挪过去。
  💗💗要挪动a柱子上最大的盘子,得先把a柱子上那两个盘子挪走,那这个怎末挪动呢??
  💗💗我们发现这一步和n== 2时的情景非常类似。按照n==2的步骤,把那俩个小盘子通过c柱子挪动到b柱子上(不能挪动到c柱子上,我们需要用这个柱子放最大盘子)。
  💗💗这时我们就可以把a柱子上最大的那个盘子挪到c柱子上了。
  💗💗最后把那个俩盘子通过a柱子挪动c柱子上就可以了
在这里插入图片描述

🔱🔱n==N,题目要求我们把a柱子上的N个盘子通过b柱子转移到c柱子上。

  💗💗首先我们要把a柱子上的盘子挪到c柱子上,先想办法把a柱子上最下面那个最大的盘子挪到c柱子上,剩余的那N-1个才可以挪过去。
  💗💗要挪动a柱子上最大的盘子,得先把a柱子上那N-1个盘子挪走,那这个怎末挪动呢??
  💗💗我们发现这一步和n== N-1时的情景非常类似。按照n==N-1的步骤,把那N-1个小盘子通过c柱子挪动到b柱子上(不能挪动到c柱子上,我们需要用这个柱子放最大盘子)。
  💗💗这时我们就可以把a柱子上最大的那个盘子挪到c柱子上了。
  💗💗最后把那N-1盘子通过a柱子挪动c柱子上就可以了

通过这里我们发现,他们采用的相同的方式实现,这与递归的定义是一致的。

递归是一种在函数定义中使用函数自身的方法。在递归过程中,函数将问题分解为更小的子问题,并通过调用自身来解决这些子问题。递归通常用于解决可以被分解为相同类型的子问题的问题,直到达到基本情况为止。

2.如何编写代码

💫 💫.重复子问题----->函数头

将a柱子上的N个盘子借助b柱子转移c柱子上(知道递归需要哪些参数)
dfs(a,b,c,n);

💫 💫.只关心某个问题----->函数体

把递归函数当成一个黑盒,相信他一定能完成任务

1.先把a柱子上除去最后一个盘子通过c柱子挪到b柱子上–>dfs(a,c,b,n-1);
2.把a柱子剩余的挪动到c柱子上------> c.push_back(a.back()); a.pop_back();
3.把b柱子上的盘子通过a柱子转移到c柱子上–》dfs(b,a,c,n-1);

💫 💫.递归出口---》到哪不可再分

我们发现仅仅剩下一个盘子就不可再分,那麽也就是n==1就是递归出口,把a柱子盘子直接放在c柱子上

n==1–>c.push_back(a.back()); a.pop_back();

三、代码实现

class Solution {
public:void hanota(vector<int>& a, vector<int>& b, vector<int>& c) {dfs(a,a.size(),b,c);}void dfs(vector<int>& a, int n,vector<int>& b, vector<int>& c){if(n==1){c.push_back(a.back());a.pop_back();return;}dfs(a,n-1,c,b);c.push_back(a.back());a.pop_back();dfs(b,n-1,a,c);}
};

总结

以上就是我们对Leetcode中汉诺塔问题详细介绍,希望对大家的学习有所帮助,仅供参考 如有错误请大佬指点我会尽快去改正 欢迎大家来评论~~

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

css原子化的框架Tailwindcss的使用教程(原始html和vue项目的安装与配置)

安装教程 中文官网教程 原始的HTML里面使用 新建文件夹npm init -y 初始化项目 安装相关依赖 npm install -D tailwindcss postcss-cli autoprefixer初始化两个文件 npx tailwindcss init -p根目录下新建src/style.css tailwind base; tailwind components; tailwind ut…

【python入门】day12:bug及其处理思路

bug的常见类型 粗心 / 没有好习惯 思路不清 lst[{rating:[9.7,2062397],id:1292052,type:[犯罪,剧情],title:肖申克的救赎,actors:[蒂姆罗宾斯,摩根弗里曼]},{rating:[9.6,1528760],id:1291546,type:[剧情,爱情,同性],title:霸王别姬,actors:[张国荣 ,张丰毅 , 巩俐 ,葛优]},{r…

卷麻了,00后测试用例写的比我还好,简直无地自容...........

经常看到无论是刚入职场的新人&#xff0c;还是工作了一段时间的老人&#xff0c;都会对编写测试用例感到困扰&#xff1f;例如&#xff1a; 如何编写测试用例&#xff1f; 作为一个测试新人&#xff0c;刚开始接触测试&#xff0c;对于怎么写测试用例很是头疼&#xff0c;无法…

linux性能优化

文章目录 性能优化图CPU进程和cpu原理性能指标 性能优化图 CPU 进程和cpu原理 进程与线程&#xff1a; 进程是程序的执行实例&#xff0c;有自己的地址空间和系统资源。线程是进程内的执行单元&#xff0c;共享进程的资源。在多核系统中&#xff0c;使用多线程可以更好地利用多…

Web 自动化测试过程中会遇到哪些问题?

作者&#xff1a;木可 链接&#xff1a;https://www.zhihu.com/question/636965892/answer/3341410674 来源&#xff1a;知乎 著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。 Web自动化是指使用测试脚本来自动执行网页上的任务。这包括填…

mybatis快速批量插入工具类

代码示例&#xff1a; package com.ly.cloud.util; import java.util.List;import javax.annotation.PostConstruct; import javax.annotation.Resource;import com.google.common.collect.Lists; import org.apache.ibatis.session.ExecutorType; import org.apache.ibatis.s…

Linux Debian12安装和使用ImageMagick图像处理工具 常见图片png、jpg格式转webp格式

一、ImageMagick简介 ImageMagick是一套功能强大、稳定而且免费的工具集和开发包。可以用来读、写和图像格式转换&#xff0c;可以处理超过100种图像格式&#xff0c;包括流行的TIFF, JPEG, GIF, PNG, PDF以及PhotoCD等格式。对图片的操作&#xff0c;即可以通过命令行进行&am…

派可数据BI 助力生产企业数字化质量管理,全面提升产品品质

在制造业中&#xff0c;出了质量问题&#xff0c;生产和质检部的同事都先抱怨。大家觉得质量问题是品控部门的问题&#xff0c;生产质量有瑕疵&#xff0c;检验人员就要负责。而检验人员又觉得&#xff0c;品质是生产出来的&#xff0c;而不是检验出来的&#xff0c;只有在生产…

服务器为什么大多用 Linux?

服务器为什么大多用 Linux&#xff1f; 在开始前我有一些资料&#xff0c;是我根据自己从业十年经验&#xff0c;熬夜搞了几个通宵&#xff0c;精心整理了一份「Linux的资料从专业入门到高级教程工具包」&#xff0c;点个关注&#xff0c;全部无偿共享给大家&#xff01;&#…

1.3 金融数据可视化

跳转到根目录&#xff1a;知行合一&#xff1a;投资篇 已完成&#xff1a; 1.1 编程基础   1.1.1 投资-编程基础-numpy   1.1.2 投资-编程基础-pandas 1.2 金融数据处理 1.3 金融数据可视化 文章目录 1. 金融数据可视化1.1. matplotlib1.1.1. 沪深300走势图1.1.2. 日线均线…

计算机网络-动态路由

网络层协议&#xff1a;ip&#xff0c;ospf&#xff0c;rip&#xff0c;icmp共同组成网络层体系 ospf用于自治系统内部。 一个路由器或者网关需要能够支持多个不同的路由协议&#xff0c;以适应不同的网络环境。特别是在连接不同自治系统的边缘路由器或边界网关的情况下&#…

Qt之自定义分页(翻页)控件

当数据量较大时,分页显示是个不错的选择。这里用百家姓来演示分页效果,包括首页、上一页、下一页、尾页和跳转。 一.效果 每页15个姓氏。 二.实现 QHPageWidget.h #ifndef QHPAGEWIDGET_H #define QHPAGEWIDGET_H#include <QWidget> #include <QStandardItemMod…

Docker安装Elasticsearch,kibana,ik分词器

安装elasticsearch 下载elasticsearch&#xff0c;查看版本&#xff1a;Elasticsearch Guide [8.11] | Elastic docker pull elasticsearch:7.17.16 查看镜像是否下载成功 docker images 创建网络&#xff0c;因为需要部署kibana容器&#xff0c;要让es和kibana容器互联 …

Linuk安装Prometheus+grafana监控

Linuk安装Prometheusgrafana监控 文章目录 Linuk安装Prometheusgrafana监控服务器环境配置1.prometheus监控框架工具介绍2.Prometheus 源码安装和启动配置2.1 下载2.2安装2.3默认prometheus.yml 配置解释2.4直接启动服务2.5 访问http://localhost:90902.6将Prometheus配置为系统…

webRTC实时通信demo

参考文档&#xff1a; https://www.jianshu.com/p/f439ce5cc0be https://www.w3cschool.cn/socket demo流程示意图&#xff08;用户A向用户B推送视频&#xff09;&#xff1a; #mermaid-svg-0KZaDQ5DBl28zjmZ {font-family:"trebuchet ms",verdana,arial,sans-seri…

SpringBoot从配置文件中获取属性的方法

方式一&#xff1a;Value 基本类型属性注入&#xff0c;直接在字段上添加Value("\${xxx.xxx}")即可&#xff0e;注意这里用的是$&#xff0c;而不是&#xff03;&#xff0c;Value注入的属性&#xff0c;一般其他属性没有关联关系。 配置文件 user:name: Manaphya…

Docker介绍、常用命令、项目部署

什么是Docker 简单说&#xff1a;Docker就是一个虚拟机&#xff0c;专业说&#xff1a;它是一个开源的容器平台。它和我们常用的VMware有很多相似的地方。 名词解释 镜像/images 由本体打包出来的文件。并不是文件本身&#xff0c;但是具有该文件的功能。举个不太贴切的例子&…

保姆级教程:从0到1搭建web自动化测试环境

之前都是在linux上安装&#xff0c;第一次在windows上配置环境&#xff0c;加上距离上次配置环境有点久了&#xff0c;竟也花了点时间。特此记录下保姆级教程&#xff0c;给初学者一个有效的参考&#xff01; 一. 环境搭建 工具清单 工具工具名版本Java开发工具包JDK1.8浏览…

2024美赛数学建模思路A题B题C题D题E题F题思路汇总 选题分析

文章目录 1 赛题思路2 美赛比赛日期和时间3 赛题类型4 美赛常见数模问题5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 美赛比赛日期和时间 比赛开始时间&#xff1a;北京时间2024年2月2日&#xff08;周五&#xff…

Spring AOP的环境搭建、切入点表达式、通知注解

Spring AOP的实现 Spring AOP环境搭建AOP坐标依赖引入添加xml配置实现三层架构 定义切入点Pointcut("匹配规则")切入点表达式1. 执行所有的公共方法2.执行任意的set方法3.设置指定包下的任意类的任意方法 (指定包: com.svt.service)4.设置指定包及于包下的任意类的任…