c语言先定义函数的汉诺塔 先定义函数求,然后在主程序中( 二 )


为了更清楚地描述算法,可以定义一个函数movedisc(n,a,b,c) 。该函数的功能是:将N个盘子从A杆上借助C杆移动到B杆上 。这样移动N个盘子的工作就可以按照以下过程进行:
1) movedisc(n-1,a,c,b);
2) 将一个盘子从a移动到b上;
3) movedisc(n-1,c,b,a);
重复以上过程,直到将全部的盘子移动到位时为止 。
*程序与程序注释
#includestdio.h
void movedisc(unsigned n,char fromneedle,char toneedle,char usingneedle);
int i=0;
void main()
{
unsigned n;
printf("please enter the number of disc:");
scanf("%d",n); /*输入N值*/
printf("\tneedle:\ta\t b\t c\n");
movedisc(n,'a','c','b'); /*从A上借助B将N个盘子移动到C上*/
printf("\t Total: %d\n",i);
}
void movedisc(unsigned n,char fromneedle,char toneedle,char usingneedle)
{
if(n0)
{
movedisc(n-1,fromneedle,usingneedle,toneedle);
/*从fromneedle上借助toneedle将N-1个盘子移动到usingneedle上*/
++i;
switch(fromneedle) /*将fromneedle 上的一个盘子移到toneedle上*/
{
case 'a': switch(toneedle)
{
case 'b': printf("\t[%d]:\t%2d.........%2d\n",i,n,n);
break;
case 'c': printf("\t[%d]:\t%2d...............%2d\n",i,n,n);
break;
}
break;
case 'b': switch(toneedle)
{
case 'a': printf("\t[%d]:\t%2d...............%2d\n",i,n,n);
break;
case 'c': printf("\t[%d]:\t %2d........%2d\n",i,n,n);
break;
}
break;
case 'c': switch(toneedle)
{
case 'a': printf("\t[%d]:\t%2d............%2d\n",i,n,n);
break;
case 'b': printf("\t[%d]:\t%2d........%2d\n",i,n,n);
break;
}
break;
}
movedisc(n-1,usingneedle,toneedle,fromneedle);
/*从usingneedle上借助fromneedle将N-1个盘子移动到toneedle上*/
}
}
C语言汉诺塔要看懂递归程序,往往应先从最简单情况看起 。
先看hanoi(1, one, two, three)的情况 。这时直接将one柱上的一个盘子搬到three柱上 。注意,这里one柱或three柱到底是A、B还是C并不重要,要记住的是函数第二个参数代表的柱上的一个盘被搬到第四个参数代表的柱上 。为方便,将这个动作记为:
one =》three
再看hanoi(2, one, two, three)的情况 。考虑到hanoi(1)的情况已经分析过了 , 可知这时实际上将产生三个动作,分别是:
one =》two
one =》three
two =》three
很显然,这实际上相当于将one柱上的两个盘直接搬到three柱上 。
再看hanoi(3, one, two, three)的情况 。分析
hanoi(2, one , three, two)
one =》three
hanoi(2, two, one, three)
即:先将one柱上的两个盘搬到two柱上,再将one柱上的一个盘搬到three柱上,最后再将two柱上的两个盘搬到three柱上 。这不就等于将one柱上的三个盘直接搬到three柱上吗?
运用归纳法可知 , 对任意n,
hanoi(n-1, one , three, two)
one =》three
hanoi(n-1, two, one, three)
就是先将one柱上的n-1个盘搬到two柱上,再将one柱上的一个盘搬到three柱上 , 最后再将two柱上的n-1个盘搬到three柱上 。这就是我们所需要的结果!
C语言函数递归调用汉诺塔问题我一步步的给你讲,就会懂啦:
首先hanoi函数如果把当中的move函数给去掉,就变成了:
void hanoi(int n, char one , char two, charthree)
{
if(n == 1)
printf("%c-%c\n", one, three);
else
{
hanoi(n - 1, one, three, two);
printf("%c-%c\n", one, three);
hanoi(n - 1, two, one, three);
}
}
【c语言先定义函数的汉诺塔 先定义函数求,然后在主程序中】也就是把move(one,three),变成了printf("%c-%c\n", one, three); 。少了一个函数,更加清晰

推荐阅读