汉诺塔求解

原创 2015年07月09日 14:49:42

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

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


相关文章推荐

汉诺塔问题求解

  • 2015年06月15日 17:28
  • 1KB
  • 下载

c语言求解汉诺塔问题

  • 2014年08月22日 11:08
  • 12KB
  • 下载

汉诺塔问题递归求解

一、问题描述  如下图所示,从左到右有A、B、C三根柱子,其中A柱子上面有从小叠到大的n个圆盘,现要求将A柱子上的圆盘移到C柱子上去,期间只有一个原则:一次只能移到一个盘子且大盘子不能在小盘...

汉诺塔问题求解 (代码)

  • 2010年03月12日 14:38
  • 2KB
  • 下载

汇编语言汉诺塔问题求解

  • 2010年12月28日 13:00
  • 4KB
  • 下载

汉诺塔递归求解

问题描述:有三根相邻的柱子,标号为X,B,C,A柱子上从下到上按金字塔状叠放着n个不同大小的圆盘,要把所有盘子一个一个移动到柱子B上,并且每次移动同一根柱子上都不能出现大盘子在小盘子上方,...

[python]汉诺塔问题求解

汉诺塔问题:将A塔上的5个圆盘移动到C塔上 可以用递归的思路来求解该问题,为了使问题一般化,假设要移动n个圆盘。根据递归的思路,可以考虑先把上面n-1个圆盘移动到B塔上,然后将最底下的n号圆盘移动到...

用C语言栈的方式求解汉诺塔游戏

汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序...

JAVA求解汉诺塔问题

首先,我们来了解一下,什么shi
  • ljtyzhr
  • ljtyzhr
  • 2014年09月01日 23:34
  • 569

求解汉诺塔问题

下面介绍汉诺塔问题以及给出其求解方法和java代码。 n阶汉诺塔问题:假设有三个塔座,假设为x, y, z. 现在在x塔座上有n个直径各不相同的圆盘,且满足从下到上直径依次减小。问题是需要借助y塔座...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:汉诺塔求解
举报原因:
原因补充:

(最多只允许输入30个字)