河内塔算法

2018-10-10  本文已影响10人  DoflaKaiGo

河内塔算法的介绍网上资料很多,我在这里再把需求简单说一下,有三棵柱子(A,B,C),A柱子上套了n个从小到大的圆环,要把这所有的n个圆环移动到C柱子上.

规则:小的圆环只能放到大的圆环上面,或者这个圆环下面没有圆环

void  hanoi(int n, char A, char B, char C) {
    if(n == 1) {
        printf("Move sheet %d from %c to %c\n", n, A, C);
    } else {
        hanoi(n-1, A, C, B);
        printf("Move sheet %d from %c to %c\n", n, A, C);
        hanoi(n-1, B, A, C);
    }
}
int main() {
        int n;
        printf("请输入盘数:");
        scanf("%d", &n);
        hanoi(n, 'A', 'B', 'C');
        return 0;
}

理解:河内塔是个很好的理解递归的算法问题,只有一个圆环的时候即是终止条件,大于1的时候递归,我是这样理解的:

n = 1; 直接把A上的环移到 C
n = 2;先把上面小的从A移到B,再把下面大的从A移到C,再把小的从B移到C
当n>2时,把上面的n-1个看成一个整体,这样就变成了n=2的问题了,把上面n-1个作为整体的从A移到B,再把下面大的从A移到C,再把n-1个从B移到C,此时我们压力考虑的就就是怎么把n-1个移到C的问题,把 n-1 看成 上面的n-2个下面的 1个,又是变成两个环的移动问题了......以此类推,直到下面的环都移动完了,只剩上面最后一个就是 n=1的情况,直接移到C就完成了所有环的移动.
即每次只移动最下面一个环,上面的交给递归完成

上一篇下一篇

猜你喜欢

热点阅读