想要用C语言中的函数递归实现汉诺塔,首先要清楚汉诺塔中的圆盘是如何移动的。
以两个盘子举例,要将第二个盘子移到C柱则要先将第一个盘子移到B柱,在将第二个盘子移到C柱,再将第一个盘子移到C柱。
由特殊归纳到一般就是要先将第n-1个盘子移到B柱,再将第n个盘子移到C柱,最后将第n-1个盘子移到C柱,而接下来就是同样的步骤,只不过为了将第n-1个盘子移动到B柱,先要将第n-2个盘子移动到C柱。由此很容易就可以看出要用递归的方法解决这个问题。用符号表示为:
n-1-->B ;n-->C; n-1-->C。
然后我们可以尝试用代码的方式表示。首先写出一个主函数,要可以取数据得知有几个盘子,并调用说明如何移动盘子的函数。主函数如下
int main()
{
int n=0;
printf("A柱子上的盘子个数:");
scanf("%d", &n);
Hanoi(n, 'A', 'B', 'C',);
return 0;
}
将三个塔的名称和盘子个数的数据给Hanoi函数后,要开始写这个函数了。首先,考虑特殊情况,也就是只有一个盘子时,直接将盘子移动到C柱子即可,之后,根据上面对汉诺塔运行原理的推理,运用递归写出先将第n-1个盘子移到B,也就是Hanoi(n-1 ,A , C ,B);之后就可以移动第n个盘子了,可以用一个函数打印盘子移动情况,move(n , A , C);最后将第n-1个盘子移到C柱就可以了,代码如下:Hanoi(n-1, B, A, C);由于这两个函数不需要返回值,用void即可,再加上主函数,整体代码如下:
void move(int n, char A, char C)
{
printf("把第%d个圆盘从%c--->%c\n", n, A, C);
}
void Hanoi(int n, char A, char B, char C,)
{
if (n == 1)
move(n, A, C);
else
{
Hanoi(n - 1, A, C, B);
move(n, A, C);
Hanoi(n-1, B, A, C);
}
}
int main()
{
int n=0;
printf("A柱子上的盘子个数:");
scanf("%d", &n);
Hanoi(n, 'A', 'B', 'C',);
return 0;
}