问题概述:在A柱子上从下往上按照大小顺序摞着N片黄金圆盘。要求把圆盘从下面开始按大小顺序重新摆放在另一根(B or C)柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
如图所示:
(ps:我们以从A移动到C来分析)
思路:如果只有一个盘子,那么就是直接把该盘子从A柱子移动到C柱子
如果有两个盘子,那么先把上面的1号盘子从A柱子移动到B柱子,然后将最下面的2号盘子从A柱子移动到C柱子,然后将1号盘子从B柱子移动到C柱子
如果有三个盘子,那么我们想到的肯定是,想要把最大的3号盘子上面的1号和2号盘子移动到B柱子上,然后再把3号盘子从A柱子移动到C柱子上,然后再把1号和2号盘子从B柱子移动到C柱子上。但是,一次只能移动一个盘子,所以,就可以把1号和2号盘子的移动拆解成有两个盘子的情况。
通过三次演示,其实不难发现,对应汉诺塔的问题,我们可以把它拆分成这样的规律
假设有N个盘子,
步骤1:我从A柱子借助C柱子,把前N-1个盘子移动到B柱子上,
步骤2:然后把第N个盘子,从A柱子移动到C柱子上,
步骤3:然后再把前N-1个盘子从B柱子借助A柱子移动到C柱子上。
步骤1又可以拆解成,是如何把N-1个盘子从A柱子移动到B柱子上的,那么就可以把这N-1个盘子,看成同样的一个问题去解决。即
步骤4:把前N-2个盘子从A柱子借助B柱子移动到C柱子上,
步骤5:然后再把第N-1个盘子从A柱子移动到B柱子上,
步骤6:然后再把前N-2个盘子从C柱子移动到B柱子上
步骤4又可以拆解成,是如何把N-2个盘子从A柱子移动到C柱子上的,那么就可以把这N-2个盘子,看成同样的一个问题去解决。即
步骤7:把前N-3个盘子从A柱子借助C柱子移动到B柱子上,
步骤8:然后再把第N-2个盘子从A柱子移动到C柱子上,
步骤9:然后再把前N-3个盘子从B柱子移动到C柱子上
以此类推,层层递进,一直到倒推完成上述步骤,同样的,步骤3也是通过该道理完成的,倒着推回去,就了解了。
递归算法
解法思路:(假设disc_n 等于4)
步骤1:if条件表达式不成立,使用hanno(3, ‘A’, ‘C’, ‘B’);用来表示步骤1,即将前3个盘子从A柱子借助C柱子移动到B柱子
步骤2:而当以该参数再次传递给hanno函数的时候,这个时候,disc_n = 3, pillar_A = ‘A’, pillar_B = ‘C’, pillar_C = ‘B’, 因为不满足if条件表达式,继续将新disc_n的值(值为2)作为参数传递,而此时,因为pillar_B = ‘C’, pillar_C = ‘B’, 所以互换之后,第二次hanno(2, ‘A’, ‘B’, ‘C’);就是从A柱子将前2个盘子借助B柱子移动到C柱子,等价于步骤4,以此类推