-
河内塔(hanoi)算法
河内塔算法的介绍网上资料很多,我在这里再把需求简单说一下,有三棵柱子(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就完成了所有环的移动.
即每次只移动最下面一个环,上面的交给递归完成
网友评论