淘先锋技术网

首页 1 2 3 4 5 6 7

首先,我谈一下自己对原版hanoi问题递归公式的推导。
优秀的理解网址,有图形
我按照他的,也就是将A上的n个圆盘(编号从下往上是n->1)通过B移动到C。
首先,在什么也不知道的情况下,我自己模拟一下,来发现规律(不会画图,自己在草稿本上画吧)。
首先是1->C,2->B,然后就是1->B(先不要直接1->A,否则不利于找出子过程),现在的情况是A:n->3,B:2->1,C没有.然后就发现(有一种直接用n=1,n=2,n=3来发现子过程),就是将1->n-1先移动到B,然后将n移动到C,此时C相当于空的(因为最大的在下面)然后将剩余的1->n-1通过中间C移动到B,最后的递归条件就是n=1.
通俗地讲就是,现将最大的那个移动到C,这就现要求将上面的1->n-1先移动到B。然后C相当于空的,所以此时,规模为n-1的问题与原问题形式一样,全部在一个柱子上,然后通过一个空的柱子,全部移动到另外一个柱子上。然后就可以递归了。知道规模缩小到n=1,虽然我并不知道,具体如何将1->n-1移动到C。

 public static void hanoi(int n,char A,char B,char C)
    {
        if(n == 1)//圆盘只有一个时,只需将其从A塔移到C塔
            TowersOfHanoi.move(1, A, C);//将编b号为1的圆盘从A移到C
        else
        {//否则
            hanoi(n - 1, A, C, B);//递归,把A塔上编号1~n-1的圆盘移到B上,以C为辅助塔
            TowersOfHanoi.move(n, A, C);//把A塔上编号为n的圆盘移到C上
            hanoi(n - 1, B, A, C);//递归,把B塔上编号1~n-1的圆盘移到C上,以A为辅助塔
        }
    }

然后就是对代码的理解,函数的声明意思是:现在规模为n的hanoi(相当于A:1->n,B:0,C:0),将A上的n个圆盘通过B移动到C.
函数内部的理解:首先是递归结束条件。然后:三个核心子过程,将1->n-1从目前认为的A(等价意义,比如现在的C相当于原来的A)通过C移动到B,然后将最下面的n从A移动到C,最后将1->n-1从B通过A移动到C。
至于n=x时要操作多少次,可以打表观察规律,也可以理论分析出来。
这个对思维能力还是要求比较高,不过还是递归蛮有意思,将一个复杂问题简单化。
hanoi变式题-HDU集锦