汉诺塔问题:在一个柱子上从下到上有着大到小的圆盘,现要将这些圆盘移动到另一个柱子上,并且保持从下到上圆盘大小依旧是从大到小,每次只能移动一个圆盘。
void Hanoi(int num,char sou,char tar,char aux) //定义三个柱子
{
}
首先编码函数Hanoi,定义圆盘个数num,三个柱子(起始柱sou,目标柱tar,辅助柱aux)
void Hanoi(int num,char sou,char tar,char aux) //定义三个柱子
{
static int i=1;
if(num==1)
{
printf("第%d次,从%c移动到%c\n",i,sou,tar); //只有一个圆盘直接移动到目标柱
i++;
}
}
static为静态函数,定义static int静态整型变量i,赋初值1,i 的作用为表明第几次做什么操作。static可以存储i 的值,延长生命周期,采用递归时保证i 的值为上次i 的赋出值,而不再是函数定义初值1。考虑简单情况即起始柱sou只有一个圆盘时,此时只需要将圆盘移动到目标柱tar上即可。i++用于递归。
void Hanoi(int num,char sou,char tar,char aux) //定义三个柱子
{
static int i=1;
if(num==1)
{
printf("第%d次,从%c移动到%c\n",i,sou,tar); //只有一个圆盘直接移动到目标柱
i++;
}
else
{
Hanoi(num-1,sou,aux,tar); //递归num-1个圆盘开始移动到辅助柱
printf("第%d次,从%c移动到%c\n",i,sou,tar); //最下面的圆盘移动到目标柱
i++;
Hanoi(num-1,aux,tar,sou); //递归将辅助柱上的圆盘移动到目标柱
}
}
当圆盘不止一个时,利用递归,将起始柱sou上的num-1个圆盘移动到辅助柱aux上,在编码时要注意Hanoi中目标柱变成了辅助柱aux名(此时aux相当于目标柱)。
Hanoi结束完后,起始柱sou上还留有一个最大的圆盘。此盘直接移动到目标柱tar上即可。然后i 值加1进行下一步。
利用递归将辅助柱aux上的剩余圆盘移动到目标柱tar上,在编码是要注意Hanoi中起始柱sou变成了辅助柱aux名(此时aux相当于起始柱)
#include<stdio.h>
main()
{
printf("\n请输入圆盘个数n:");
scanf("%d",&n);
Hanoi(n,'A','B','C');
}
定义主函数
完整代码
void Hanoi(int num,char sou,char tar,char aux) //定义三个柱子
{
static int i=1;
if(num==1)
{
printf("第%d次,从%c移动到%c\n",i,sou,tar); //只有一个圆盘直接移动到目标柱
i++;
}
else
{
Hanoi(num-1,sou,aux,tar); //递归num-1个圆盘开始移动到辅助柱
printf("第%d次,从%c移动到%c\n",i,sou,tar); //最下面的圆盘移动到目标柱
i++;
Hanoi(num-1,aux,tar,sou); //递归将辅助柱上的圆盘移动到目标柱
}
}
#include<stdio.h>
main()
{
printf("\n请输入圆盘个数n:");
scanf("%d",&n);
Hanoi(n,'A','B','C');
}
代码测试