关闭

汉诺塔求解

标签: 递归汉诺塔
158人阅读 评论(0) 收藏 举报
分类:

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

汉诺塔的解题逻辑不难,跟普通递归没啥区别:(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);
    }
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:23107次
    • 积分:1491
    • 等级:
    • 排名:千里之外
    • 原创:128篇
    • 转载:6篇
    • 译文:0篇
    • 评论:0条
    文章分类