汉诺塔求解

这两天突然对递归有了兴趣,于是把以前没怎么弄明白的八皇后和汉诺塔一起过了过。觉得八皇后逻辑上挺好理解,抽象成程序语言写出来后也挺好解读,但汉诺塔的逻辑抽象成程序语言写出来后我觉得还是不怎么好理解。

汉诺塔的解题逻辑不难,跟普通递归没啥区别:(1)将所有n个盘抽象为第n盘和所有n-1盘:为了将第n盘从A移动到C,需要先把所有n-1盘移动到B,再将n移动到C,再将B上的所有n-1盘移动到C。

移动第n盘解决了,那么问题就到了如何把所有n-1盘从B移动到C,继续套用上一步骤的逻辑:(2)将所有n-1盘抽象为第n-1盘和所有n-2盘,为了将第n-1盘从B移动到C,需要先把所有n-2盘从B移动到A暂存,再将第n-1盘从B移动到C,再将A上的所有n-2盘移动到C。咦,到了这一步有没有发现规律?对,此时问题又回到了如何将所有n-2盘从A移动C,是不是又回到了(1)的逻辑!于是反复进行这2种逻辑即可,直到n == 1时直接将第1盘从A移动到C。

逻辑挺清楚,但程序写出来我不能把每一层递归中的每条语句作用解读出来。不像八皇后,每条语句我都知道它其实是暴利对比从行到列一个个试着填1然后比较,不符合则回退找同行下一列的目标。而汉诺塔,设n = 3时,第一层循环时可以理解为将剩下的2个盘从A移动到B(借助C);那么第二层循环中haino(n - 1, a, c, b)完成的是什么状态呢?暂时没想明白此时此语句对应什么样的状态。虽然程序没几句,根据逻辑大概也能理解,但当一句句从递归的具体场景来分析时,我觉得还是有难度的。以此做个记录。

void haino(int n, char a, char b, char c) {
    static int indexhaino = 1;
    if (n == 1) {
        printf("%d-->No.%d-->from %c to %c\n", indexhaino, n, a, c);
    }
    else {
        haino(n - 1, a, c, b);
        indexhaino++;
        printf("%d-->No.%d-->from %c to %c\n", indexhaino, n, a, c);
        indexhaino++;
        haino(n - 1, b, a, c);
    }
}


阅读更多
文章标签: 递归 汉诺塔
个人分类: Clang
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

不良信息举报

汉诺塔求解

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭