同理对于B来说也是如此,此时B上也是两部分,一部分是第n-1个盘子,另外一部分是这(n-1)- 1个盘子,我们要做的是把(n-1)-1个盘子移到A上,然后把第n-1个盘子移到C上。将A柱上的盘子看做2部分,一部分是最底下的那个盘子,另外一部分是n-1个盘子,我们要做的就是将n-1个盘子移到B上,把最终一个盘子移到C上;比如现在有2个盘子,3个柱子A,B,C,目标是要把A上的盘子移
目录
问题描述
汉诺塔疑问源自印度一个古老的传说,印度教的“创造之神”梵天创造世界时做了 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个盘子
代码
由此我们行得到代码:

我们也可以写一个呈现出移动步骤的版本




浙公网安备 33010602011771号