个盘子的汉诺塔需要移动几步_看漫画学C++039:递归解汉诺塔

81f386e15fb78f15efcf25e68a263af2.png

点击蓝字 关注我们

本话内容

请输入

相传在古印度圣庙中,有一种被称为汉诺塔(Hanoi)的游戏。该游戏是在一块铜板装置上,有三根杆(编号A、B、C),在A杆自下而上、由大到小按顺序放置64个金盘(如下图)。游戏的目标:把A杆上的金盘全部移到C杆上,并仍保持原有顺序叠好。操作规则:每次只能移动一个盘子,并且在移动过程中三根杆上都始终保持大盘在下,小盘在上,操作过程中盘子可以置于A、B、C任一杆上。请使用C++程序模拟汉诺塔移动金盘的过程。

0913447bc742ad2f72c9e538b726b492.png0d213fc0ca317741b06653f965d53274.png16910b26b28eaec592a0b0992bda43e5.pngc9230a94eaba0e3cd90c132f9f27f37e.png00476d05f4eddef6cbae154d3e177087.pngb9f531414ea0209bd08180e84b7254be.pngf3e4759171bc73571282fc769d7308b6.pngc4f7a175d99bda26b8d8458b2ed59d99.png67932326c591d9304e03d86a0a9befef.pngf80ae6daa9e908dca147003b0d5e70de.png

对于这样一个问题,任何人都不可能直接写出移动盘子的每一步,但我们可以利用下面的方法来解决。

假设移动盘子数为n,为了将这n个盘子从A柱移动到C柱,可以做以下三步:

  1. 以C柱为中介,从A柱将n-1个盘子移至B柱;

  2. 将底下那个盘子直接从A柱移到C柱;

  3. 以A柱为中介,从B柱将n-1个盘子移至C柱;

上面的3个步骤中,第2步可以直接一步完成,而第1步和第3步并不能直接完成,细心研究发现剩下的n-1个圆盘也可以重复再一次执行上面这3个步骤,在这里可以使用递归的方式。另外如果只有一个圆盘,我们可以直接让它从起始位置移动终点,这也就是递归的终止条件。

#include
using namespace std;
// 定义一个自定义函数,参数含义为:
// n表示有多少个圆盘需要移动
// a表示起始位置
// b表示中转站
// c表示目的地
void move(int n, char a, char b, char c) {
   // 递归终止条件:当只有一个圆盘时,直接将它从起始位置移到目的地
   if (n == 1) {
       cout << a << " ------> " << c << endl;
   } else {
       // 调用自身:将n-1个从a通过c移到b
       move(n - 1, a, c, b);
       // 将最底下那个圆盘起始位置移到目的地
       cout << a << " ------> " << c << endl;
       // 调用自身:将n-1个从b通过a移到c
       move(n - 1, b, a, c);
   }
}
int main() {
   int n = 5;
   move(n, 'A', 'B', 'C');
   return 0;
}

加入“编程玩家俱乐部”知识星球,每天都能学到有意思的编程知识哦。

65a6184845b11327545cb4a77b2a3ce1.png

看漫画学C++

看漫画也能学C++?没错!编程玩家俱乐部新推出系列课程《看漫画学C++》,带你用轻松看漫画的方式来学习C++,本课程面向零基础学员,只要坚持学习并多思考和多练习,相信你一定会成为C++的编程高手!如果喜欢本课程,就收藏一下哦,转发给你的小伙伴们,大家一起来学习!

扫码关注哦

34e43805da40f798ea8c38106b26c183.png

编程玩家俱乐部

微信号 : 编程玩家俱乐部

B站:编程玩家

官网:https://aicodeplayer.com

喜欢本篇内容请给我们点个在看

81f386e15fb78f15efcf25e68a263af2.png

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

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

相关文章

八位图 16位图_了解位图

八位图 16位图几周前&#xff0c;我和Alistair正在研究用于对节点附加到Neo4j数据库中的标签进行建模的代码。 这种工作方式是将32个节点ID的块表示为每个标签的32位位图 &#xff0c;其中1表示1表示节点具有标签&#xff0c;0表示没有标签。 例如&#xff0c;假设我们有节点…

调制深度,峰均值功率比,脉冲整形等因素对于调制损耗的影响...

我们知道光发射机中一个非常重要的参数是发射功率。如果光发射机处于无源光网络&#xff08;PON&#xff09;&#xff0c;没有后续放大器的情况&#xff0c;发射功率很大程度上决定了发射机可以传输的距离 &#xff08;功率预算&#xff0c;power budget&#xff09;&#xff1…

移动流量转赠给好友_私域流量的五大认知误区

各大品牌主对于私域流量存在的认知误区 &#xff0c;你是否也这样认为&#xff1f;目前看起来&#xff0c;私域流量好像只要前期投入&#xff0c;后期就可以为自身带来源源不断的流量&#xff0c;但是私域流量真的像看起来那么美吗&#xff1f;其实不是的&#xff0c;我们对于私…

MATLAB 显示输出数据的三种方式

1. 改变数据格式 当数据重复再命令行窗口时&#xff0c;整数以整形形式显示&#xff0c;其他值将以默认格式显示。MATLAB的默认格式是精确到小数点后4位。如果一个数太大或太小&#xff0c;那么将会以科学记数法的形式显示。比如&#xff1a; >> x100.11x 100.1100>…

Matlab 语句

1. 显示输出数据的三种方式 1.1 改变数据格式 当数据重复再命令行窗口时&#xff0c;整数以整形形式显示&#xff0c;其他值将以默认格式显示。MATLAB的默认格式是精确到小数点后4位。如果一个数太大或太小&#xff0c;那么将会以科学记数法的形式显示。比如&#xff1a; &g…

Probability, Matringale,Markov Chain, MCMC

一、基本知识 1. 条件概率 条件概率是指在某件事情已经发生的前提下&#xff0c;另一件事情在此基础上发生的概率&#xff0c;举例来说P(A丨B)表示B发生的基础上&#xff0c;A也发生的概率&#xff0c;基本公式为&#xff1a; 2. 条件期望 在上述概率下的期望我们称之为条…

html 按钮 按下 状态_科普|你身边的手动火灾报警按钮,您了解吗?

手动火灾报警按钮手动火灾报警按钮&#xff0c;是火灾报警系统中的一个设备类型&#xff0c;当建筑发生火灾时在火灾探测器没有探测到火灾的时候人员手动按下手动火灾报警按钮&#xff0c;报告火灾信号&#xff0c;向建筑所属消防控制室报火警。正常情况下当手动火灾报警按钮报…

马尔可夫蒙特卡罗 MCMC 原理及经典实现

我们在做机器学习、深度学习或自然语言处理等项目时&#xff0c;经常采用什么方法采样呢&#xff1f;大家马上会想到吉布斯 Gibbs 采样&#xff0c;今天我们来分享一种比较实用的采样方法&#xff1a;马尔可夫蒙特卡罗方法&#xff0c;吉布斯采样是其中的一种。 Markov chain …

les物流执行系统_【精益运营】立足智慧物流 推进仓储智能化稳步升级

近年来&#xff0c;“智能制造”成为制造行业的热门词汇&#xff0c;也成为引领物流行业发展的风向标。今年在两会中&#xff0c;“智能”一词首次写入报告&#xff0c;为传统行业改造升级、实现协同共享带来了新的发展机遇。早在2017年12月&#xff0c;根据公司对VMI业务整合工…

增益比值 dB 以及 dBw-dBmv 等之详解

dB 分贝&#xff08;工程应用&#xff09;&#xff0c;dB&#xff08;Decibel&#xff0c;分贝&#xff09;是一个纯计数单位&#xff0c;本意是表示两个量的比值大小&#xff0c;没有单位。在工程应用中经常看到貌似不同的定义方式&#xff08;仅仅是看上去不同&#xff09;。…

带有Spring Boot 2支持的Apache Camel 2.22发布

今天&#xff0c;我们发布了最新的Apache Camel 2.22.0版本 &#xff0c;这是第一个正式完全支持Spring Boot 2的版本。这是一项重大的工作&#xff0c;因为针对像Apache Camel这样的大型框架将Spring Boot v1升级到v2付出了很多努力–感谢骆驼队和他们的贡献。 对Spring Boot …

java 分布式事务_Java核心知识 Spring原理十五 JPA 原理

1. 事务事务是计算机应用中不可或缺的组件模型&#xff0c;它保证了用户操作的原子性 ( Atomicity )、一致性( Consistency )、隔离性 ( Isolation ) 和持久性 ( Durabilily )。2. 本地事务紧密依赖于底层资源管理器(例如数据库连接 )&#xff0c;事务处理局限在当前事务资源内…

Latex中定理、引理、证明、假设、空白行的编写

1. 引理 \newtheorem{lemma}{Lemma}[section] \begin{lemma} \label{lemma1}\end{lemma}编译效果&#xff1a; 2. 定理 \newtheorem{thm}{\bf Theorem}[section] \begin{thm}\label{thm1} Suppose system (\ref{l1}) satisfies Assumption (\ref{mim1}), the closed-loop s…

Latex设置字体大小

全局模式 \documentclass[12pt]{article} 在文档的开头&#xff0c;有设置整个文章的字体大小&#xff0c;如&#xff1a;12pt。 局部模式 设置字体大小的命令从小到大为&#xff1a; \tiny \scriptsize \footnotesize \small \normalsize \large \Large \LARGE \huge \Huge…

c 结构体在声明时赋值_C/C++编程笔记:C++入门知识,C++多态性和虚函数解析

本篇要学习的内容和知识结构概览多态性编译时的多态性称为静态联编. 当调用重载函数时, 在编译期就确定下来调用哪个函数.运行时的多态性称为动态联编. 在运行时才能确定调用哪个函数, 由虚函数来支持.静态联编中的赋值兼容性及名字支配规律派生一个类的原因并非总是为了添加新…

concurrent vs. simultaneous

Both the words mean “occurring at the same time”, but “concurrent” represents the events that occur over a period of time whereas “simultaneous” represents the events that occur at a point in time. https://www.perfmatrix.com/concurrent-users-vs-simul…

使用Spring Boot和GraphQL构建安全的API

“我喜欢编写身份验证和授权代码。” 〜从来没有Java开发人员。 厌倦了一次又一次地建立相同的登录屏幕&#xff1f; 尝试使用Okta API进行托管身份验证&#xff0c;授权和多因素身份验证。 GraphQL是Facebook在2012年开发的一种数据查询语言&#xff0c;用于解决REST API和传…

ue4材质节点大全_转载于知乎:UE4 多象限(UDIM)贴图在UE4中的应用

各位小伙伴早上好啊&#xff01;真的又隔了很久才再次见面。。这次是工作上一个同事在网上看到了一篇有意思的文章分享给我&#xff0c;觉得这种方式确实挺有意思&#xff0c;反正我是之前没有这么去考虑过。希望能够给大家带来一点启发!!此文章转载于知乎:UE4 多象限(UDIM)贴图…

Latex各种命令、符号、公式、数学符号、排版等

本文仅供学习参考使用&#xff0c;一切版权和解释权均归原作者所有&#xff0c;转载地址&#xff1a;http://blog.csdn.net/garfielder007/article/details/51646604 数学符号详细内容见&#xff1a;http://mohu.org/info/symbols/symbols.htm 直接查看链接 http://www.mohu.o…

app inventor调用图像识别_+AI场景,3步懂图像识别产品

本文重点讲述基于成熟的第三方AI平台阿里、某度、腾讯、谷歌等等中选择一个可供使用的SDK基于Python语言实现图像识别功能的GUI界面&#xff0c;从而一观图像识别车型、图像识别文本产品的实现过程。我们正处于各种图像识别的场景里&#xff0c;你去某些生鲜超市不用手机可以实…