漫漫程序媛进化鹿

汉诺塔问题py实现

2018-08-07  本文已影响22人  keeeeeenon

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根[金刚石]柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。


就是在下!

我们通过一个函数来实现:move(n, a, b, c)函数,它接收参数n,表示3个柱子A、B、C中第1个柱子A的盘子数量,然后打印出把所有盘子从A借助B移动到C的方法
刚开始对于汉诺塔问题理解不够深刻,后期经过讨论总结出以下三个步骤
以总共3个盘子为例,当3个盘子都在A点的时候,需要将2也就是(n-1)个盘子都移到B点上,这样才能将C点空出来,存放最大的那个盘子,所以这一步逻辑表达出来就这样写move(n-1, a, c, b),这一步做完了就接着下一步,把A点的1个盘子移到C点,这里就是确定的数字1,所以第二步的逻辑表达出来就如此写:move(1, a, b, c),接下来就是逻辑上的第三步,将B点上的2个(n-1)盘子移到C点,所以最后一步的逻辑表达出来就如此写:move(n-1, b, a, c)。总体概括一下就是:除了只有一个盘子(一个盘子都不存在循环了)之外,不管总共是2个,3个,4个,5个.....就把它想像划分成3个逻辑体,它就是按那3个步骤来循环,这样就简单了
代码如下:

def move(n,a,b,c):
    if n==1:
        print(a,'-->',c)
        return
    move(n-1,a,c,b)
    move(1,a,b,c)
    move(n-1,b,a,c)

或者是

def move(n,a,b,c):
    if n==1:
        print(a,'-->',c)
    else:
        move(n-1,a,c,b)
        move(1,a,b,c)
        move(n-1,b,a,c)

调用函数其输出结果均为:

move(3,'A','B','C')
A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C
move(1,'A','B','C')
A --> C
move(5,'A','B','C')
A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C
A --> B
C --> B
C --> A
B --> A
C --> B
A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C
B --> A
C --> B
C --> A
B --> A
B --> C
A --> C
A --> B
C --> B
A --> C
B --> A
B --> C
A --> C

小菜鸡的牙牙学语hhh
上一篇下一篇

猜你喜欢

热点阅读