c语言的问题~

来源:百度知道 编辑:UC知道 时间:2024/05/15 09:30:39
Hanoi塔问题,有一个塔,里面有A,B.C.3个座,A座有64个盘子,大的在下,小的在上,一个和尚想把64个盘子从A座移动到C座,每次只能移动一个盘子,而且要保持大的在下小的在上,要求输出移动步骤.
#include <stdio.h>
void main()
{
void hanoi(int n,char one,char,two,char three);
int m;
print("input the number of diskes:");
scanf("%d",&m);
printf("the step to moveing %d diskes:\n",m);
hanoi(m,'A','B','C');
}
void hanoi(int n,char one,char,two,char three)
{
void move(char x,char y);
if(n==1)
move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
void move(char x,char y)
{
printf("%c-->%c\n",x,y);;
}
问题1:主调函数里面的参数,向被调函数参数传递数据的时候是怎么对应的,如上面的hanoi(m,'A','B','C');向它后面的void hanoi(int n,char one,char,two,char three),hanoi(n-1,one,three,two);hanoi(n-1,two

您的程序中有个笔误,即void hanoi(int n,char one,char,two,char three)中char,two中间的逗号应去掉换成空格。
这个汉诺塔问题不好说清楚,关键是明白其中道理。
汉诺塔这是一个只有用递归方法才能够解决的问题。递归方法就是通过把问题不断转化为更简单的同样性质的问题而求得最终解决的方法。
从形式上,一个函数再调用它本身,这就是递归调用。即在调用一个函数的过程中又直接或间接地调用函数本身。无控制的递归都是无终止的自身调用,会导致死机。合理的递归程序设计应控制在某条件成立时进行递归,否则不再进行递归调用。通常在递归的调用过程中,不断改变递归的条件,以使递归条件到最后不再成立,这就能有结果。
递归程序设计的关键就是考虑问题的两种情况,一种是普遍情况即函数值等于把问题递推一步后的本函数的调用,一种是极端或端点情况,此时函数值有确定的一个值而无须再调用本函数。递归的过程就是从普遍情况逐步过渡到端点情况的过程。
就本题来说,若要将n个盘子从塔A移动到塔C,需用以下3个步骤:
(1)先设法把A上的n-1个盘子借助于C先移到B上;
(2)把A上的1个盘子(底部最大的盘子)移到C上;
(3)再设法把B上的n-1个盘子借助于A移到C上。
其中步骤(1)和(3)就是问题转化为更简单(n少了一个)的同样性质的(尽管起始位置和目标位置各异)递推一步后的问题。
这就是普遍情况。
它的极端或端点情况就是n=1即只有一个盘子时可以直接把盘子从A移到C上。
因此,如果函数hanoi(n,one,two,three)的功能是要把n个盘子从塔one移动到塔three,它的具体实现就是以下步骤:
if(n==1)
move(one,three);
else
{hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
由于本题是要打出移动的步骤,故move(one,three)就是打出one-->three形式即