家人们,快一年没更新的我回来更新啦!!!
(差点把号忘了)
已经准备小升初了!!!
我上次比赛,有一道题是关于汉诺塔的,一下就懵了,没玩过也没学过啊
今天研究汉诺塔,上网查了查,弄懂了以后发现特别简单
兴奋,突然想起落灰的CSDN(bushi),跑来更新一篇文章啦
目录
啥是汉诺塔问题?
简单来讲,汉诺塔问题是这样的:
给定三根柱子,记为 A,B,C,其中 A 柱子上有 n 个盘子,从上到下编号为 0 到 n−1 ,且上面的盘子一定比下面的盘子小。问:将 A 柱上的盘子经由 B 柱移动到 C 柱最少需要多少次?
(这段文字来源于知乎,侵删;这篇文章讲的很不错,有参考,会将所有参考文献放在文末~)
这里放一张百度上的动图给大家看一下:
图源百度,侵删
视频讲解
这里先给大家附一个bilibili上的视频,讲的非常好,本文灵感来自此视频
用二进制来解汉诺塔问题_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1rs411Y76X/大家有精力可以看一下这个视频,本文讲的没有视频好哦
汉诺塔解法——递归
汉诺塔问题其实并不复杂,可以被看成【把大象装进冰箱需要几步】
把大象装进冰箱,第一步打开冰箱门,第二步装大象,第三步关上冰箱门
解决汉诺塔问题是一样的道理
假设现在只有两个圆盘,要想把这两个圆盘从A柱移动到C柱上,需要把0号圆盘先移动到B柱,把1号圆盘移动到C柱,再把0号圆盘移动到C柱1号圆盘上方
先移开0号圆盘就相当于打开冰箱门,移动1号圆盘相当于装大象,再把0号圆盘移到1号圆盘上面相当于关上冰箱门
这样看是不是简单一些了
如果圆盘更多,怎么办?
假设有3个圆盘,分别编号为0,1,2
附上我自己画的丑陋图片(bushi
首先,2号要想动,就得先把1号和0号移走
现在把1号和0号看成一个整体移走,就相当于打开冰箱门
现在再看这个整体,1号和0号移走,就相当于我前面写的移走两个圆盘的方法
这是什么思想?递归!!!
更多的圆盘也是一样的
n号要想移走,就得把0~n-1这个塔移走
移走0~n-1,n-1还得移走,还要把0~n-1-1移走
以此类推……
汉诺塔解法——二进制
二进制是什么?逢二进一!
如果我们用二进制来数数,就会是这样的:
000, 001, 010, 011, 100, 101, 110, 111……
那么用二进制怎么解汉诺塔问题呢?
首先,仍然假设有三个圆盘,我们把每个圆盘看成二进制中的一个数位,然后用二进制数数
000是初始状态;001,移动0号圆盘;010,移动1号圆盘;011,移动0号圆盘;100,移动2号圆盘;101,移动0号圆盘;110,移动1号圆盘;111,移动0号圆盘……
然后,你就会发现,问题解决了!
不信的话,你可以自己去尝试一下,真的是这样的!
参考的知乎文章上面是这样解释的(如果看不懂就去看视频!!!):
二进制的方法不止可以解决汉诺塔,还可以解决其它很多问题哦~
参考文献
侵删~关于汉诺塔问题 - 知乎 (zhihu.com)https://zhuanlan.zhihu.com/p/392523306