其他分享
首页 > 其他分享> > 汉诺塔

汉诺塔

作者:互联网

使用递归思想解决汉诺塔问题。

1.汉诺塔即一摞圆盘由大到小排列垒在一个柱子上,有三个柱子,将圆盘移到另一个柱子上保持顺序,一次只能移动一片,且大的不能在小的下面。

2.确定递归的退出条件,由极端情况来确定,例如此问题中圆盘只有一片时,只需直接移动即可。

3.如果有一片以上,假设有N片,则需要移动N-1片到别的柱子上再移动最后一片到目标盘上。

 

则由此得出,如果想移动第N篇,需要移动N-1,要移动N-1则需要移动N-2,依次类推知道最后调用移动最上层的一片,假设我们有三个盘子需要移动,那么先写出退出条件即盘子只有一个时的情况的语句:将盘子直接移动到目标柱子,盘子开始移动,结束。然后回退到上一层的调用,此时会发现我们可以移动第二个盘子了,但是不能直接移动到目标柱上,因此想完成将上两个盘子都移到目标柱子的步骤,则我们需要书写语句将第二片移动到我们的辅助柱上,再移动第一片回到初始柱,将第二片由辅助柱移动到目标柱,将第一片复位,则完成了将上两片移动到目标柱的步骤。然后再次回退到上一层,我们要移动第三片,依旧是发现无法直接移动到目标柱上,需要移动到辅助柱上,需要把前两片从目标柱上移走,当我们想要移动第二片时,会发现移不动,因为第一片在上面,则此处又开始递归调用直到最后一层即只有一片的时候,然后重复之前的动作。

则汉诺塔的实现函数

 public static void hanoi(int n,char A,char B,char C)
    {
        if(n == 1)
            TowersOfHanoi.move(1, A, C);
        else
        {//否则
            hanoi(n - 1, A, C, B);
            TowersOfHanoi.move(n, A, C);
            hanoi(n - 1, B, A, C);
        }
    }

我们会发现,在实现汉诺塔问题时,在内部实现里有并列的多次调用,并非只是简单的调用了一次。
递归法适用于解题步骤是按层次递进且具有重复性的情况下

标签:柱子,柱上,目标,汉诺塔,盘子,移动
来源: https://www.cnblogs.com/ouyangqing/p/15756068.html