C++递归经典问题——汉诺塔
创作时间:
作者:
@小白创作中心
C++递归经典问题——汉诺塔
引用
CSDN
1.
https://m.blog.csdn.net/2301_80309996/article/details/142303802
汉诺塔问题是一个经典的递归问题,源自印度的一个古老传说。相传在世界中心贝拿勒斯的圣庙里,一块黄铜板上插着三根宝石针,第一根针上套着64个金盘,金盘大小不一,大的在下,小的在上。当这64个金盘按规则全部移到最后一根针上时,世界末日就会到来。这个问题不仅富有传奇色彩,更是计算机科学中递归算法的经典案例。
问题描述
一块板上有三根杆子,A,B,C。A杆上套有64个大小不等的圆盘,大的在下,小的在上。要把这64个圆盘从A杆移到C杆上,每次只能移动一个圆盘,移动可以借助B杆进行。但在任何时候,任何杆上的圆盘都必须保持大盘在下,小盘在上。求移动的步骤。
以下是n=3的情况:
目标:
思路解析
汉诺塔问题的核心在于递归思想的应用。具体来说,可以将n个圆盘的移动过程分解为以下三个步骤:
- 将A杆上的n-1个圆盘借助C杆移动到B杆上
- 将A杆上剩下的一个圆盘直接移动到C杆上
- 将B杆上的n-1个圆盘借助A杆移动到C杆上
通过递归地执行上述步骤,最终可以将所有圆盘从A杆移动到C杆。
代码实现
下面是用C++实现的汉诺塔问题代码:
//汉诺塔
#include<iostream>
using namespace std;
void hanoi(int n,char x,char y,char z) {
if(n==1) {
cout<<x<<"->"<<z<<endl;
}
else {
hanoi(n-1,x,z,y);
cout<<x<<"->"<<z<<endl;
hanoi(n-1,y,x,z);
}
}
int main() {
int n;
cin>>n;
cout<<"The step to moving "<<n<<" disks:\n";
hanoi(n,'A','B','C');
return 0;
}
学习方法
- 明确递归简化思想:将n个托盘看作是两部分上面的n-1个和第n个,并不断对其进行递归划分直至n=1,直接输出。
- 模型意识:即推广意识。一上来不要把问题细化考虑,先明确每一步的目标是什么(即划分),并逐步执行;如果想不明白的小伙伴可以象我一样,以n = 3为例,将具体步骤按照模型逐步拆解,看看结果是否和答案一样,进一步论证自己的模型是正确的。
热门推荐
婴儿几个月会叫爸爸妈妈
初中生也能当兵?2025最新政策解读!这些条件你必须知道!
批量修改文件名的实用技巧与方法总结
肚子和臀部的赘肉怎么减
培养积极的阅读者和理性的表达者
10种最火的外卖,哪些是你最爱?
全国首份产业地图什么样?武汉“产业画像”一屏统揽
产权车位跟使用权车位区别 产权车位产权证怎么办
中国龙文化——中华民族神圣的象征
首次利用代谢舱精准监测并探究佩戴N95口罩对心肺负担的影响
首次利用代谢舱精准监测并探究佩戴N95口罩对心肺负担的影响
探索传统瑰宝:揭秘虎骨酒的奥秘与争议
手动挡车打不起来火了怎么处理
暗区突围攻略:装备捡取、作战指南针获取及值得捡取的物品推荐
上交所延长交易时间?新通知被误解到离谱!但凡理解下“指定交易”也不会中招
胡琏“狮子吞蚂蚁”战术首用得逞,蒋介石大赏,但再用却惨败
去昆明地铁站怎么走最方便?最快方式及指南,以及如何乘坐地铁到昆明站
高中数学:三角函数之考点精华-对称性相关问题
金桔柠檬茶的做法与功效
空调热力膨胀阀开度计算方法
碘伏消毒液介绍
蚂蚁团结协作的精神是什么
地球经历了几个纪元
《永乐大典》:中华民族的辉煌印记
三体经典段落:细思极恐的文明与人性之思
为什么会长智齿?原因都有哪些
五种食疗改善手脚冰凉
后背长白色的痘痘是什么原因
无人机在应急救援中的多种应急方案
湖南绥宁:积极化解生猪行业环保压力 促进产业高质量发展