请教下Hanoi塔问题知道它意思,就是不理解函数的过程他的递归调用是根据什么编的?为什么这样编?move(int n,int x,int y,int z){if(n==1)printf("%c-->%c\n",x,z);else{ move(n-1,x,z,y);printf("%c-->%c\n",x,);move(n-1,y,x,z)
来源:学生作业帮助网 编辑:六六作业网 时间:2025/02/03 14:31:49
请教下Hanoi塔问题知道它意思,就是不理解函数的过程他的递归调用是根据什么编的?为什么这样编?move(int n,int x,int y,int z){if(n==1)printf("%c-->%c\n",x,z);else{ move(n-1,x,z,y);printf("%c-->%c\n",x,);move(n-1,y,x,z)
请教下Hanoi塔问题
知道它意思,就是不理解函数的过程
他的递归调用是根据什么编的?为什么这样编?
move(int n,int x,int y,int z)
{if(n==1)
printf("%c-->%c\n",x,z);
else
{ move(n-1,x,z,y);
printf("%c-->%c\n",x,);
move(n-1,y,x,z);
}
请教下Hanoi塔问题知道它意思,就是不理解函数的过程他的递归调用是根据什么编的?为什么这样编?move(int n,int x,int y,int z){if(n==1)printf("%c-->%c\n",x,z);else{ move(n-1,x,z,y);printf("%c-->%c\n",x,);move(n-1,y,x,z)
解释如下:(不妨再温习一下什么是Tower of Hanoi)
三根柱子x,y,z.其中x上有n个直径递增的圆盘(最顶为最小,然后往下一次增大),现在要把x上的n个圆盘移到z上,要求在移动的过程中不允许出现任何大的圆盘叠放在任何小的圆盘上,柱y可作中转用).
如果柱x上只有一个圆盘
if(n==1),那么只需要将x上的这一个圆盘移到z上即可.程序中的
printf("%c-->%c\n",x,z);
就是把移动的方向打印出来显示在屏幕上.
否则(即柱x上有不止一个圆盘)
else
{
move(n-1,x,z,y);
printf("%c-->%c\n",x,z);
move(n-1,y,x,z);
}
我们先把柱x上最上面的(n-1)个圆盘移到柱y(记住柱y本来就是作中转用的)上(先不要去深究这n-1个圆盘怎么移得到柱y上,假设能办到),
move(n-1,x,z,y);
注意此时我们的x,y,z的角色变了.我们要从x上移动圆盘到y上了.你不妨这样标记一下move形参
move(圆盘数,来源柱,中转柱,目标柱).就是说现在x的角色是来源柱,y的角色是目标柱,我们要把x上的n-1个圆盘移到y上.
这一步完成之后,我们就该把剩在柱x上的那个最大的圆盘移到柱z上了.printf("%c-->%c\n",x,z);
现在我们的状态是最大的圆盘已经在z上,其余的n-1个在y上,x上没有圆盘.我们在交换一下x,y,z的角色:
move(n-1,y,x,z);
对照move(圆盘数,来源柱,中转柱,目标柱),
我们要把y上剩余的n-1个圆盘移到z上.
自此,n个圆盘全都从x上移到了z上.
你可以用很简单的情形来验证,比如n=2,和n=3,实在不行,可以动手画画看.这样会有助你理解.