汉诺塔递归函数问题

来源:百度知道 编辑:UC知道 时间:2024/05/29 01:47:32
请各位大侠详细说明一下下面递归函数是如何运作的.
int step=1;
void move(int , char ,char,char); 这一句什么意思.为什么可省去变量名.
main()
{int n;
printf("请输入盘数n=" );
scanf("%d",&n);
printf("在3根柱子上移%d只盘的步骤为:\n",n);
move(n,'a','b','c');}这一句?
void move(int m, char p, char q, char r)
{if (m==1)
{printf("[%d] move 1# from %c to %c\n", step, p,r);
step=step+1;}
else{move(m-1,p,r,q); 这一句是如何运行的.
printf("[%d] move %d# from %c to %c\n",step, m,p,r);
step=step+1;
move(m-1,q,p,r); 这一句是如何运行的.
}
getch();}
能否从以下开始详细像上面那样说明一下程序的运行过程吗?本人主要不知道函数的运行过程.
返回B第一次调用
6,向下执行,执行完毕,返回A第一次调用
7,本次函数中p=a,q=b,r=c,m=3,向下执行,输出a->c,执行B,调用本身(B第一次调用),传入q,p,r(b,a,c),m=2
8,p=b,q=a,r=c,m=2,执行A,调用本身(A'第一次调用,注意是B函数调用中再次调用A) 传入p,r,q(b,c,a)
9,p=b,q=c,r=a,m=1,执行if,输出b->a,返回A'第一次调用

递归其实很简单,你只要晓得啥子是嵌套调用就可以了,所谓嵌套调用,就是在一个函数里调用另一个函数,main函数不能被调用的,所以递归就是有限次的嵌套调用本身函数,每次调用,系统都会重新分配内存,返回时就返回上次调用他的那块内存中的调用函数处,这样理解应该很简单了

void move(int , char ,char,char); /*声明函数,告诉系统我随后要定义一个函数,他不对其中参数进行检查,所以可以省略参数,一般只写类型,表示有多少个什么类型的参数,便于自己理解 */
main()
{int n;
printf("请输入盘数n=" );
scanf("%d",&n);
printf("在3根柱子上移%d只盘的步骤为:\n",n);
move(n,'a','b','c');}/*函数调用,用a,b,c代表3跟柱子,把盘子数,柱子代码传给函数*/
void move(int m, char p, char q, char r) //定义函数
{if (m==1)
{printf("[%d] move 1# from %c to %c\n", step, p,r);
step=step+1;}
else{move(m-1,p,r,q); //调用本身函数,进行递归 A
printf("[%d] move %d# from %c to %c\n",step, m,p,r);
step=step+1;
move(m-1,q,p,r); //再次调用 B
}
getch();}

这里面的递归涉及一个汉诺塔的算法问题,具体讲明白的话有点麻烦,总体思路是假设盘子全在a柱上,想放到c上
第N个人就想要是有人搬动其他N-1个盘子到b,那他只要搬一次从a到c就可以,在让那个人把N-1个盘子放到c上
第N-1那个人就想要是有人搬动其他N-2个盘子到c,