hannoi塔(汉诺塔)移动过程解析

来源

汉诺塔是来源于印度的一种古老的益智游戏。它总共有三根柱子,分别为A,B,C。初始状态下,A柱中有N个盘子,这N个盘子有大有小,大的在下面,小的在上面。游戏的最终目标就是将A柱上的所有盘子移到C柱上,中间可以经过B柱,过程中必须保持大盘在下面,小盘在上面。如图所示:
汉诺塔

算法引申

在这个题目中,我们把关注点投向最优解实现:需要用最少的步骤完成游戏,移动的过程是怎么样的。
现在让我们在脑海中想一下自己操作的时候会怎么做?先来定义一下每根柱上的实时数目{A:N, B:0, C:0}
我们要把A柱上的N个盘移到C柱,就要先把A柱上面的N-1个盘移到B柱上,此时A柱上只有一个,状态是{A:1, B:N-1, C:0},移动最A中仅有的那个盘到C,状态是{A:0, B:N-1, C:1},此时,我们再把B中N-1个盘移动到C,状态是{A:0, B:0, C:N}
将n个盘的移动操作记为F(n),整理一下操作步骤:
1. A移动N-1个盘到B: F(n-1);
2. A移动最大盘到C: F(1)即为1;
3. B移动N-1个盘到C: F(n-1);
于是我们可以得到等式:

F(n)=F(n-1)+F(1)+F(n-1)=2*f(n-1)+1

通过数学归纳法可以得到F(n)= 2^n+1
至此,我们解决了第一个问题,通过 (2^n+1) 次移动,可以完成游戏。

那么移动的过程是怎样的呢?
汉诺塔的移动只需要三步,前面已经分析过了,可以看出这是一个典型的递归函数,我们可以打印出移动的步骤:

python解法

# 汉诺塔移动,把n个盘将a移到c,途中经转b
def move(n, a, b, c):
    if n == 1:
        print('move', a, '-->', c)  #根部迭代,一次情况下,直接 a --> c 移动 
        return
    move(n-1, a, c, b)              #把a中的n-1个盘移动到b,途中经转c
    print('move', a, '-->', c)      #把a中的1个盘移动到c
    move(n-1, b, a, c)              #把b中的n-1个盘移动到c,途中经转a

move(4, 'A', 'B', 'C')

这里写图片描述
我们用python定义了一个move函数,它的第一个参数为需要移动的个数n,第二个参数为出发柱a,第三个参数为中转柱b,第三个参数为目标柱c,完成的操作是从出发柱移动了n个盘子到目标柱

运行结果
这里写图片描述

汉诺塔的讲解到这里应该也比较清晰了,本质就是递归调用,最重要的一点是

汉诺塔的移动只需要三步

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章