汉诺塔(递归)

递归、搜索与回溯算法


文章目录

  • 递归、搜索与回溯算法
  • 前言
  • 一、递归的思想
  • 二、汉诺塔
  • 三、为什么可以使用递归思想?
  • 四、代码实现


Leetcode汉诺塔

前言

这是记录我学习算法的一个专题,如果你正在备战这类比赛,我想这对你一定有帮助。


一、递归的思想

把一个大型复杂问题层层转化为一个与原问题相似,但规模较小的子问题来求解;直到子问题不能再被拆分,递归就结束了。
简单来说,递归就是将一个问题分解为多个逻辑相同的子问题来解决。

二、汉诺塔

在这里插入图片描述

我简单对上面题目做一下阐述
在这里插入图片描述
有A、B、C三根柱子,其中在A柱子上,按照从大到小的顺序放有N个大小不同的盘子,我们需要做的就是将盘子,从A柱子移到C柱子,在移动时一次只能移动一个,并且要保证小圆盘必须在大圆盘之上。

三、为什么可以使用递归思想?

接下来我,通过举例、画图讲解。

要想保证移动后,大圆盘在小圆盘之下,我们应该想方设法将最大的圆盘移至C,那么该怎么做呢?这时我们就需要利用辅助柱子B了,我们需要将A柱子上的其余盘子移动到B(具体怎么移动,看我们下面讲解),这时A柱子上就剩最大盘子了,我们就可以将最大盘子移至C,这时我们只需要想法将B柱子上的盘子也移动到C就可以完成要求了。
当A柱子上的圆盘个数

N=1时:
在这里插入图片描述
由于只有一个盘子,我们之间移动即可。
N=2时:
在这里插入图片描述
当N=2时,第一步我们要将A顶部盘子,移动到B柱子,这时就可以直接将A底部盘子移动到C柱子,再将B柱子上的盘子移动到C柱子程序结束。
N=3时:
在这里插入图片描述
我们仍需要的是将,最大的盘子移动至C柱子,也就是说,我们需要将A柱子上,上面两个盘子移动到B柱子,该怎么完成它呢?大家仔细想将两个盘子,移动到一个柱子上!!!这不就是N=2的情况吗?无非就是目标柱子从C变为了B,我再啰嗦一点,将这里画出来
在这里插入图片描述
到这里A柱子上的两个盘子算都移动到B柱子上了,接下来只需要将最后一个移动到C柱子即可。

大家都知道怎么移动的了,接下来我就将上面的看为一个整体

在这里插入图片描述
N=4时:
在这里插入图片描述
我们需要将最大的移动到C,就需要将上面三个移动到B,这不又是我们讲过的一个吗?接下来就不赘述了
在这里插入图片描述
从N=2开始,N每增加一个数都可以被我们看成,在前一个基础上,多一点了个最大盘子,这就叫做将一个问题分解为逻辑相同的子问题。
分析上面情况我们可以看到,当N=1是执行步骤不同,递归条件这不就来了

四、代码实现

再看代码时,注意看注释!!!!

这里是oj题,要在网站上跑!!

 void hanota(vector<int>& A, vector<int>& B, vector<int>& C) {dfs(A,B,C,A.size());//将A上的A.size()个圆盘移动到C柱子}void dfs(vector<int>& a, vector<int>& b, vector<int>& c,int n){if(n==1)//柱子上圆盘为1,直接移动并返回至上一层{c.push_back(a.back());a.pop_back();return ;}dfs(a,c,b,n-1);//将使用C作为辅助柱子,将A柱子的前n-1个移动到B柱子c.push_back(a.back());//此时A柱子上只剩一个最大盘子,直接移动至C柱即可a.pop_back();dfs(b,a,c,n-1);//这时最大圆盘在C上,在将B柱子上剩余n-1个圆盘移动到C柱子即可return;}

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

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

相关文章

【JUC-锁升级】简要版本

锁升级过程 一、偏向锁二、轻量级锁三、重量级锁四、整体流程 为什么不全部使用Synchronized、Lock等重量级锁呢&#xff1f; 重量级锁底层是基于操作系统的互斥锁实现的&#xff0c;涉及到用户态与内核态之间的切换。 一、偏向锁 如果只有一个线程A频繁的访问某一个共享资源…

C++小碗菜之二:软件单元测试

“没有测试的代码重构不能称之为重构&#xff0c;它仅仅是垃圾代码的到处移动” ——Corey Haines 目录 前言 什么是单元测试&#xff1f; 单元测试的组成 单元测试的命名 单元测试的独立性 Google Test 单元测试的环境配置与使用 1. Ubuntu下安装 Google Test 2. 编写…

家庭财务管理系统的设计与实现ssm小程序+论文源码调试讲解

2系统关键技术 2.1 微信小程序 微信小程序&#xff0c;简称小程序&#xff0c;英文名Mini Program&#xff0c;是一种全新的连接用户与服务的方式&#xff0c;可以快速访问、快速传播&#xff0c;并具有良好的使用体验。 小程序的主要开发语言是JavaScript&#xff0c;它与普…

linux运维命令

防火墙相关命令 防火墙规则查看 firewall-cmd --list-all 禁ping firewall-cmd --permanent --add-rich-rulerule protocol valueicmp drop firewall-cmd --reload 执行完以上命令后&#xff0c;通过firewall-cmd --list-all查看规则生效情况 firewall-cmd --list-all 其…

高通---Camera调试流程及常见问题分析

文章目录 一、概述二、Camera配置的整体流程三、Camera的代码架构图四、Camera数据流的传递五、camera debug FAQ 一、概述 在调试camera过程中&#xff0c;经常会遇到各种状况&#xff0c;本篇文章对camera调试的流程进行梳理。对常见问题的提供一些解题思路。 二、Camera配…

HCIA-openGauss_2_1数据库安装部署

本章导读 openGauss是关系型数据库&#xff0c;采用客户端/服务器&#xff0c;单进程多线程架构&#xff0c;支持单机和一主多备部署方式&#xff0c;备机可读&#xff0c;支持双机高可用和读扩展。 本章详细介绍了安装openGauss的环境和安装部署配置、openGauss数据库的连接…

《Tyche: Stochastic In-Context Learning for Medical Image Segmentation》CVPR2024

摘要 这篇论文介绍了一个名为Tyche的模型&#xff0c;它用于医学图像分割任务。Tyche通过使用上下文集来为以前未见过的任务生成随机预测&#xff0c;无需重新训练。该模型解决了两个主要问题&#xff1a;1) 对于大多数新的分割任务&#xff0c;需要重新训练或微调新模型&…

47 基于单片机的书库环境监测

目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机&#xff0c;采用DHT11湿度传感器检测湿度&#xff0c;DS18B20温度传感器检测温度&#xff0c; 采用滑动变阻器连接数模转换器模拟二氧化碳和氧气浓度检测&#xff0c;各项数值通过lc…

NAND闪存行业全面且深入的分析

根据QYResearch调研团队的最新报告“全球NAND闪存市场报告2023-2029”&#xff0c;预计2029年全球NAND闪存市场规模将达到1263亿美元&#xff0c;未来几年年复合增长率&#xff08;CAGR&#xff09;为10.0%。这一预测揭示了NAND闪存市场的强劲增长潜力。 一、市场研究与发展趋…

html-两个div,让一个div跟随另外一个div的高度

在开发的过程中遇到有些场景事这样的&#xff0c;两个div的高度不一致&#xff0c;而且都是动态高度&#xff0c;有的时候div1高&#xff0c;有的时候div2高&#xff0c;如果设置flex的话&#xff0c;那么就会把较矮的元素撑大&#xff0c;但是我想始终都以div1的高度作为基准&…

函数方法不占额外存储空间(内存分区)?

上篇博客说到扩展是不会增加存储空间的&#xff0c;且扩展不能扩展存储属性。既然这样&#xff0c;那我们就能理所应当推断出方法是不占存储空间的&#xff0c;为什么呢&#xff1f; 首先&#xff0c;我们要先了解内存的五大分区&#xff1a;栈&#xff0c;堆&#xff0c;静态…

IDEA注释格式、匹配补全调整

1.注释格式调整 目前重新捡起一部分Java&#xff0c;写代码时候发现注释快捷键总是放在第一列&#xff0c;看起来很难受&#xff0c;故寻找方法如下&#xff1a; 分别点击 编辑器-代码样式-Java 修改注释代码选项如下 2.大小写匹配补全问题 还发现在写代码过程中&#xff0c…

抖音矩阵系统快速部署指南/抖音矩阵系统源码分发,短视频矩阵账号管理系统开发部署—

抖音矩阵系统的源码分发与短视频账号管理平台的开发部署&#xff0c;要求通过对接官方API来实现功能的拓展。当前开发的账号矩阵管理系统专注于提供一键式管理多个账户的能力&#xff0c;支持定时发布内容、自动化关键词生成以实现搜索引擎优化&#xff08;SEO&#xff09;和霸…

算法笔记:力扣49.字母异位词分组

思路&#xff1a;排序哈希表映射 关键API&#xff1a; char [] arr str.toCharArray(); 将字符串转为字符数组返回。 Arrays.sort(arr)&#xff1b; 对数组进行排序&#xff1b; Map.getOrDefault(Object key, V defaultValue): 要查找的键和默认值。如果键存在&#xf…

医疗服务高质量发展项目会议在杭州成功举办

2024年11月30日&#xff0c;医疗服务高质量发展项目会议在杭州成功举办&#xff0c;此次会议旨在探讨医疗服务领域的最新进展和未来趋势&#xff0c;推动医疗服务的高质量发展。来自全国各地的医院管理者、专家学者齐聚一堂&#xff0c;共同分享智慧医疗、绩效考核、精细化管理…

k近邻法基本知识简记

一、原理与概念 1、样本 k近邻法使用的样本数据集合&#xff0c;称作训练样本集&#xff0c;并且样本集中每个数据都存在标签&#xff0c;即样本集中每个数据与所属分类的对应关系已知。 2、原理 输入没有标签的新数据后&#xff0c;将新数据的每个特征与样本集中数据对应的…

开源C代码之路:一、Gitee

开源c代码之路&#xff1a;一&#xff0c;Gitee 前言1、开源项目2、从哪里找&#xff1f;3、举个例子4、总结&#xff1a; 本系列回顾清单开源代码示例 前言 从开源开发的角度&#xff0c;由浅入深&#xff0c;一步步初探C语言编程的入门之路。 本篇讲解&#xff1a;Gitee 1…

极化定标未知数,反射对称条件下

把观测到的协方差矩阵都看作方程&#xff0c;则观测方程有16个&#xff0c;对角线四个实数&#xff0c;非对角线六个复数。 未知数有18个 f1 f2 d1 d2 d3 d4是12个 绝对幅度A 1个和绝对相位 θ在协方差中被消去了 协方差矩阵&#xff08;反射对称性下&#xff09;有5个未知数…

基于STM32的Wi-Fi无人机项目

引言 随着无人机技术的快速发展&#xff0c;基于微控制器的DIY无人机变得越来越流行。本项目将介绍如何使用STM32微控制器制作一架简单的Wi-Fi无人机。通过本项目&#xff0c;您将了解到无人机的基本组成部分&#xff0c;如何进行硬件连接&#xff0c;代码编写&#xff0c;以及…

【附源码】基于环信鸿蒙IM SDK实现一个聊天Demo

项目背景 本项目基于环信IM 鸿蒙SDK 打造的鸿蒙IM Demo&#xff0c;完全适配HarmonyOS NEXT系统&#xff0c;实现了发送消息&#xff0c;添加好友等基础功能。代码开源&#xff0c;功能简洁&#xff0c;如果您有类似开发需求可以参考。 源码地址&#xff1a;https://github.c…