关于递归实现汉诺塔
当有两个盘子时,
先把第一个盘子(蓝)挪到B
第二个盘子(绿)挪到 C
第一个盘子(蓝)从B挪到C,完成挪动
当有三个盘子时,
先把第一个盘子(红)挪到C
第二个盘子(蓝)挪到 B
第一个盘子(红)挪到 B
第三个盘子(绿)挪到C
第一个盘子(红)挪到A
蓝B->C
红A->C,完成移动
综上,
从小看,想要把盘子挪到目的地时,都要把他的上面的盘子挪到中转位置
从大看,把n-1个盘子挪到B,执行完成之后,n-1个盘子在B上,最后一个盘子在A上,然后
把在A上最后一个盘子,挪到C,最后把n-1个盘子从B挪到C
总结得到代码如下:
#include<stdio.h>
//A B C三个柱子把A上的盘子挪到C B作为中间,一次只能挪一个
//先把上面n-1挪走,到B,最下面的挪到C
void move(char pos1, char pos2)
{
printf("%c->%c ", pos1, pos2);
}
//n盘子的个数
//pos1:起始位置
//pos2:中转位置
//pos3:目的位置
void Hanoi(int n, char pos1, char pos2, char pos3)
{
if (n == 1)
move(pos1, pos3);
else//两个及以上
{
Hanoi(n - 1, pos1, pos3, pos2);//把n-1个盘子挪到B,执行完成之后,n-1个盘子在B上,最后一个盘子在A上
move(pos1, pos3);//把在A上最后一个盘子,挪到C;
Hanoi(n - 1, pos2, pos1, pos3);//现在要把n-1个盘子从B挪到C
}
}
int main()
{
Hanoi(1, 'A', 'B', 'C');
printf("\n");
Hanoi(2, 'A', 'B', 'C');
printf("\n");
Hanoi(3, 'A', 'B', 'C');
return 0;
}
运行结果