汉诺塔问题的一些看法

105 阅读2分钟

前言

前几天写了一个文章是有关于递归是怎么思考的,其中我写到你想不出递归大概率是因为不够聪明,我觉得是真的。在短的情况下,还能直接得出来,但是在复杂数据前面你推理就比较难了。不信的话,你想一想你写过的数学题目,基本知识点就是哪几个,但是等到你真正实战的时候就会冥思苦想这道题要怎么变形呢?最好变成我擅长的领域,可大多时候只是想过之后终于想到自己做不出来,然后拿到答案恍然大悟原来要这么做。但是科学地思考方式不一定会让你做出这道题,但是对这道题目的理解一定是有所加深的。

起因

最近要复习算法,所以就重新看了一遍自己之前学过的递归相关的题目。汉诺塔是很令我困惑的,因为在不懂汉诺塔问题后,学了很多递归相关的知识。所以这次再挑战一下。

思考边界和非边界的逻辑条件

我在本子上反复地画图之后,边界条件就是只有一块的时候直接放到重点。但是非边界怎么写呢。我们假设有n个(n>1),就先将n-1个放到b上,然后就是n放到c。接着就是将b上的n-1个以a为中转站放到c。这个过程中,就是目的地和中转不停地变化。所以要以参数形式传递。 代码如下

public static void hanoi(int nDisks,char  A,char B,char C){
    if (nDisks==1){   
        move(nDisks,A,C);
        return;
    }
    hanoi(nDisks-1,A,C,B);
    move(nDisks,A,C);
    hanoi(nDisks-1,B,A,C);
}

private static void move(int nDisks,char sourceTower,char destTower) {
    System.out.println("编号为"+nDisks+"的盘子正在从"+sourceTower+"移动到"+destTower);
}