栈与递归

汉诺塔问题

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

如图说明了怎么把n个圆盘分解成小问题去解决

首先,我们要移动n个,比如这里三个,那么我首要解决的问题是,先移动第1个到第n-1个那一坨到辅助轴y上,只要把这个问题解决了就好办了。

只要上面的解决了,那么下面只要把最后一个,即第n个直接移动到z就行了。

已经把最后一个移动到z了,接下来问题在于怎么再把y上n-1个移动到z,不管它,还是一样直接一坨就是过去。

然后就没有然后了。

我们发现,问题的关键在于这一坨到底是怎么实现直接把它从一个柱子移动到另一个柱子的。所以只要实现这一的一个函数就可以了,然而我们又发现,这个问题不就是移动n个数据这个问题本身吗,而这个问题我们不是已经解决了吗,拿过来就是用得了。

代码示例

/* 将 x 上编号为 1 到 n 的圆盘移动到 z,而 y 作为辅助塔 */
void hanoi(int n, char x, char y, char z)
{
    if(n == 1)
        move(x,1,z);       /* 将编号为 1 的圆盘从 x 移动到 z */
    else {
        hanoi(n-1,x,z,y);  /* 将 x 上编号为1至n-1的圆盘移动到 y,而z作辅助塔 */
        move(x,n,z);       /* 将最底下的n从圆盘x移动到z */
        hanoi(n-1,y,x,z);  /* 将y上编号为1至n-1的圆盘移到z,x做辅助塔 */
    }
}
原文地址:https://www.cnblogs.com/wjundong/p/11625979.html