汉诺塔问题
目录
问题描述
思路解析
代码
问题描述
汉诺塔问题源自印度一个古老的传说,印度教的“创造之神”梵天创造世界时做了 3 根金刚石柱,其中的一根柱子上按照从小到大的顺序摞着 64 个黄金圆盘。梵天命令一个叫婆罗门的门徒将所有的圆盘移动到另一个柱子上,移动过程中必须遵守以下规则:
- 每次只能移动柱子最顶端的一个圆盘;
- 每个柱子上,小圆盘永远要位于大圆盘之上;
思路解析
比如现在有2个盘子,3个柱子A,B,C,目标是要把A上的盘子移动到C上,方法就是先把小的借助B移到B上,然后把A上的大的移到C上,然后把B上的盘子移到C上。
再比如现在有3个盘子,A,B,C三个柱子,同样把A上的盘子移到C上。
我们由此可以将问题拆解:
将A柱上的盘子看做2部分,一部分是最底下的那个盘子,另外一部分是n-1个盘子,我们要做的就是将n-1个盘子移到B上,把最后一个盘子移到C上;然后在把B上的n-1个盘子移到C上
同理对于B来说也是如此,此时B上也是两部分,一部分是第n-1个盘子,另外一部分是这(n-1)- 1个盘子,我们要做的是把(n-1)-1个盘子移到A上,然后把第n-1个盘子移到C上。最后把A上的(n-1)-1个盘子移到C上
然后依次往复,直到A,B上的盘子归零,盘子全放在C上。
即:第一步:移n-1个到临时柱
第二步:移最大盘到目标柱
第三步:移n-1个到目标柱
我们现在的问题就是想去算n个盘子从A移到C上的次数,不难得出递归的两个条件
- 限制条件:A柱子或者B柱子上的盘子数为1,当盘子数为1,肯定只需要移动1次即可。
- 逼近条件:A柱子或者B柱子上的盘子每次都分为最后1个和其他个,即1与n-1,直到只剩1个盘子
代码
由此我们可以得到代码:
我们也可以写一个显示出移动步骤的版本