函数递归问题,急需各位解决!

来源:百度知道 编辑:UC知道 时间:2024/06/15 02:46:11
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);
move(m-1,y,x,z);
}
}
main()
{
int h;
printf("\ninput number: \n");
scanf("%d",&h);
printf("the step to move %2d diskes: \n",h);
move(h,'a','b','c');
}
这里的h假如是3,那么该程序执行的过程是什么?(最主要的是该函数递归的过程是什么) else下面有三个函数调用语句,请问先后顺序是什么
在主调函数如move(m-1,x,z,y);中,x,z,y的值是否分别为a,c,b?

执行顺序为:
move(m-1,x,z,y);
首先执行,h为成2,代入move中再次执行
{
move(m-1,x,z,y);
再次调用,h变成1,执行
{
printf("%c----->%c\n",x,z);
}
接着输出:
printf("%c---->%c\n",x,z);
同理,不再详说了!
move(m-1,y,x,z);
}
printf("%c---->%c\n",x,z);
move(m-1,y,x,z);

递归并不是照顺序一个一个来的,如果有执行到返回函数的话,先执行子函数,如最先执行的move(m-1,x,y)由于返回了函数,所以又从move函数里从头判断开始执行,直接不会重复执行为止!

你在地址栏上直接输入:
javascript:var a=function move(m,x,y,z){if(m==1)alert(x+"-->"+z);else{move(m-1,x,z,y);alert(x+"-->"+z);move(m-1,y,x,z)}};move(3,"a","b","c") 并按回车就可以看到结果了!就好像树一样,递归是从树枝上执行回到树根的!

*************自己看看吧!!********************
和你的程序一个类型的:

#include <stdio.h>

//递归汉诺塔程序
//参数定义:n为移动的盘子数,from指开始所在盘,tmp为中间盘,to为目标盘
void haoii(int n,int from,int tmp,int to)
{
if (n==0) return;
//将n-1个盘子以目标盘为中介,从开始盘递到中间盘