汉诺塔是运用递归思维解决编程问题的典型例题。
有三个圆柱ABC,将n个圆环由小到大地从A移动到C,这类问题可以从直观情况入手。当n=1时,移动过程只有一步:A->C;当n=2时,移动过程有三步:A->B A->C B->C;当n=3时,移动过程有七步:A->C A->B C->B A->C B->A B->C A->C。通过观察规律,发现可以用“如果要...首先要...”的句式归纳:如果要移动第n个圆环,首先要先将n-1个圆环从A移动到B,然后将第n个圆环从A移动到C;如果要移动第n-1个圆环,首先要先将n-2个圆环从A移动到B,然后将第n-1个圆环从B移动到C...从而实现将一个复杂问题拆分成相同的许多简单小环节。
通过这种逆向思维可以开始构建递归算法。递归算法的优势在于:由于递归的每一环节都是相同的,所以编写代码时只需要关注第一个过程。
代码如下:
#include <stdio.h>
void move(char pos1, char pos2)
{
printf("%c->%c ", pos1, pos2);
}
void Hanoi(int n, char pos1, char pos2, char pos3)
//作用:将圆环从pos1经过pos2移动到pos3
{
if(n==1)
move(pos1, pos3);
else
{
Hanoi(n-1, pos1, pos3, pos2);
//先将前n-1个圆环从pos1移动到pos2(注意递归的环节是相同的,所以可以先不考虑进入Hanoi函数后具体的运行)
move(pos1, pos3);
//再将第n个圆环从pos1移动到pos3
Hanoi(n-1, pos2, pos1, pos3);
//最后将前n-1个圆环从pos2移动到pos3
}
}
int main()
{
int n;
scanf("%d", &n);
Hanoi(n, 'A', 'B', 'C');
return 0;
}
1万+

被折叠的 条评论
为什么被折叠?



