汉诺塔问题的理解与疑问以及开头逻辑写出来

2020.10.20
今天第一次见到汉诺塔问题
理解了一些部分

先将汉诺塔问题大概是什么说一下:
据说创世纪时Benares有一塔波罗教塔,是由三支钻石棒所支撑,开始时神在第一根棒上放置64个由上至下依次由小到大的金盘,并命令僧侣将所有的金盘从第一根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之时,此塔将摧毁,也就是世界末日来临之时。

1.一开始将汉诺塔问题看成了数学问题,其实是一个逻辑问题,输出并不是算术而是逻辑。这个想法一开始就误导着我,定义字符是为了算什么呢,一直看不懂定义函数的作用,感觉只是写了个框架,并没有把里面真正的算法写出来,一直陷入这个死循环里,直到看到大佬们的讲解,才从误区走出来。

2.递归的想法也和正常想法不一样,正常人是要看到顺序的逻辑,有前才有后,而递归刚好相反,你先写出后面,这时你要当作前面的已经写好了,以此往回递归,可能是第一次接触这种,还在c语言的循环结构里不能自拔。。。

//n表示需要移动盘子的数量,X表示源塔,Y表示借用塔,Z表示目标塔
//①借助Z塔,将前n-1个盘子从X塔移动到Y塔
Hanoi(n - 1, X, Z, Y);
//②将X塔上剩下的1个盘子移到Z塔
printf("\t将第%d个盘片从%c移动到%c\n",n,X,Z);
//③借助X塔,将前n-1个盘子从Y塔移动到Z塔
Hanoi(n - 1, Y, X, Z);

这里是自己还有的一些问题,为什么写成这样,就能把(前n-1个盘子从X塔移动到Y塔),(前n-1个盘子从Y塔移动到Z塔),这是为什么,我能理解将n-1个盘子看成整体,但是不懂为什么这么写就能移动。还是说这还是逻辑,实际上计算机里面并没有移动,还是什么其他。

这边放出编写好的汉诺塔问题

#include <iostream>
using namespace std;

void Hanoi(int n, char X, char Y, char Z)
{
//n表示需要移动盘子的数量,X表示源塔,Y表示借用塔,Z表示目标塔

if (
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

走丢的男孩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值