C语言函数递归调用问题

#include <stdio.h>
#include <conio.h>
int move(int m,int x,int y,int z);
int main(void)
{
int h;
printf("\nPlease input number:\n");
scanf("%d",&h);
printf("the step to moving %2d diskes:\n",h);
move(h,'a','b','c');
getch();
return 0;
}
int move(int m,int x,int y,int z)
{
if(m==1)
printf("%c----->%c\n",x,z);
else
{
move(m-1,x,z,y);
printf("%c----->%c\n",x,z,y);
move(m-1,y,x,z);
}
}
---------------------------------------------
上面的程序是Hanoi塔问题的代码。。请解释下程序是怎么运行的??越详细、越通俗易懂越好!

第1个回答  2009-05-21
它主要有两个函数HANOI和MOVE,HANOI表示的是移动前N-1个盘子,MOVE表示移动第N个盘子,参数'A','B','C'表示的是柱子的名称,在程序中ONE,TWO,THREE这三个参数让人看了一头雾水,如果把变量名称改为SOURCE,TEMP,DESTINATION我想更好理解,这三个变量表示的是起始的柱子,过渡的柱子,和目标柱子,可能会问已经把三个柱子命名为A,B,C,为什么还要引入三个变量即:ONE,TWO,THREE(SOURCE,TEMP,DESTINATION).以移动3个盘子为例说明一下这个程序的思路:第一步把前两个从 ONE(SOURCE)借助TWO(TEMP)移动到THREE(DESTINATION)用HANOI函数中的第一个HANOI函数实现,第二步把 ONE余下的最大的盘子移动到THREE,用MOVE函数实现,第三步把TWO柱上的两个盘子借助THREE移回到ONE,用HANOI函数中的第二个 HANOI函数实现,(因为THREE柱上的盘子已经是最大的了,任何盘子都可以放到它的上面,所以可以想象为它不存在)可以想象第三步的时候TWO变成了起始柱,而ONE变成了目标柱,而THREE变成过度柱了,HANOI函数参数的变化正体现了这一点.当运行到这里时,第3个盘子已经从ONE移动到了 THREE(这只是分析,真实情况是只有当递归完成时才做到这一步).这个时候原先移动3个盘子的问题变成移动两个盘子的问题,所以再调用HANOI时盘子的数量为N-1.直到N==1时,调用结束.

递归还是不用好
第2个回答  2009-05-23
要理解递归吗,最好是化多为少
递归的本质是知道(1)a0,(2)递推关系an=f(an-1),那么要求任意an都是可能的
因此汉诺塔可以分解为只有二个盘子,把前(n-1)看作1个
那么n个盘子的问题变成2个盘子的问题

即有二块盘子在x上,现要通过y移到z上
(看下面的之前先自己想一下怎么移二块)

第一步:把上面那一块盘子从x通过z移到y上(为什么不直接移,因为不一定是一块)
第二步:把下面那块直接移到y上(为什么直接移,因为确切只有一块)
第三步:把y上那块盘子通过x移到z上,任务完成(为什么不直接移,因为不一定只有一块)

接下来就是具体实现了,递归一定要有初始条件
即只有一块的时候,只接移,移好就结束
if(m==1)
printf("%c----->%c\n",x,z);
否则就按二块移
else
{
move(m-1,x,z,y); 第一步
printf("%c----->%c\n",x,z,y); 第二步
move(m-1,y,x,z); 第三步
}
第3个回答  2009-05-24
算法思路,比如说10个圆盘,需要从a处移到c处,就是先把上面的9个盘移到b处,(怎么移呢,再调用函数move)再把第十个盘移到c处,再把b里面的9个移到c处,(怎么移呢,再调用函数move)。

经典的函数递归调用案例。
程序解释:函数move(h,'a','b','c');
if(m==1)
printf("%c----->%c\n",x,z); 如果只有一个盘子,那么从x处移到z处。
否则,move(m-1,x,z,y); 先把最上面的m-1个盘子移到y处。
printf("%c----->%c\n",x,z,y); 再把剩下的一个移到从x处移到z处。
move(m-1,y,x,z);再把y处的m-1的盘子移到z处。

关键要理解算法,以及函数中的
move(int m,int x,int y,int z)代表把m个盘子从x移到z处,
move(m-1,x,z,y); 代表把m-1个盘子移到y处,本回答被提问者和网友采纳
第4个回答  2009-05-23
递归分为:递推和回推
例:有3个人 不知道其年龄 只找到地给个比第二个大2 第二个比第三个大2 第三个10 ;因此:
递推:第一个——》第二个——》第三个(10)
回推:第三个(10)---》第二个(12)--》第一个(14)

此题一样,是汉诺塔的递归问题。
想要移动盘子,只让最上面的盘子移动,。。。。类推
有三个盘子x, y,z。利用递归算法 将x上的盘子移动到z上 (大的在下,小的在上)

#include <stdio.h>
#include <stdlib.h>
int move(int m,int x,int y,int z)
{
if(m==1) //递归结束条件
printf("%c------>%c\n",x,z);
else
{
move(m-1,x,y,z); //借助y将x上得m-1个盘移动到z上
printf("%c------>%c\n",x,z);
move(m-1,y,x,z); // 借助x盘将y上得m-1个盘移动到z上
}
return m;
}
int main(void)
{
int h;
printf("\nPlease input number:\n");
scanf("%d",&h); //输入盘子的个数
printf("the step to moving %2d diskes:\n",h);
move(h,'a','b','c'); //调用递归函数
system("pause");
return 0;
}

相关了解……

你可能感兴趣的内容

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 非常风气网