Hanoi Tower--汉诺塔问题

版权声明:未经本人许可,不得用于商业用途及传统媒体。转载请注明出处! https://blog.csdn.net/qikaihuting/article/details/83039679

问题描述

  • 源于印度一个古老传说。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,任何时候,在小圆盘上都不能放大圆盘,且在三根柱子之间一次只能移动一个圆盘。问应该如何操作?

思想:递归

  • 归纳推理:设柱子的序号依次为A,B,C;圆盘的原始位置为A,目标位置是C;圆盘个数为n;
    1. n=1.则直接一步操作A---->C,steps=1
    2. n=2.则先将第1块移到B:A-->B,再第2块移到C:A-->C,最后:B-->C,steps=1+1+1=3
    3. n=3.则将第一块和第二块当成一个整体,通过上一步的操作,可以移到B,之后第三块移到C;最后类似上一步的逆操作完成第一块和第二块到C的移动;steps =3+1+3=7
  • 类似以上操作,容易观察到,整个流程其实分为三个阶段完成:
    • A取出前n-1块移至B;
    • A中的第n块移至C;
    • B中的前n-1块移至C;
  • 当n=4时,第一阶段需要移7步,第二阶段需要一步,第三阶段也需要7步;因此steps=7+1+7=15
  • 很显然,通过归纳,不难发现其中的规律。
  • 因此,总的步骤为: S ( n ) = 2 n 1 S(n)=2^n-1

代码实现

  • 具体的移动步骤用python打印出来,总步骤可直接用公式计算。
def hanoi(n, a, b, c):
    if n == 1:
        print(a, '-->', c)
    else:
    	#A前n-1块移到B
        hanoi(n-1, a, c, b)
        # 第n块移到C
        print(a, '-->', c)
        # B中前n-1块移至C
        hanoi(n-1, b, a, c)
if __name__=="__main__":
	hanoi(5, 'A', 'B', 'C')

猜你喜欢

转载自blog.csdn.net/qikaihuting/article/details/83039679