汉诺塔问题的思维方式很重要,正向和逆向都很容易绕晕,要从中间开始展开
显而易见,如图所示的情况是移动过程中必须的一步,而问题就可以分解为前半部分:如何将k-1
个盘子从A->B
及后半部分:如何将k-1
个盘子从B->C
,这两个问题本质上又是一样的。根据归纳法,k
个盘子的移动可以通过k-1
个盘子的移动解决,故使用递归算法。
void hanoi(int n, char A, char B, char C) {
if(n == 1)
//递归到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); //后半部分
}
}