关于潭浩强的C程序设计(第三版)汉诺塔程序的问题~~~~拜托!!

来源:百度知道 编辑:UC知道 时间:2024/06/26 01:33:06
汉诺塔这个程序我已经弄了好几天了,可是仍然没有什么突破~~希望朋友们帮帮忙!!我总结了一下,对于这个程序我主要有以下几个问题:
1) 书上说:(有三个盘)比如要把最上面的两个盘从A---B,需要借助C,请问这里的借助怎么理解??
2) 对于hanoi函数是我最大的障碍
void hanoi(int n,char one,char two ,char three)
{if(n==1)move(one,three);
else
{
hanoi(n-1,one,three,two);
move(one,three);
hanoi(n-1,two,one,three);
}
}
我主要有以下几方面的问题:
a)为什么调用move函数时,实参总是(one,three)
b)一般递归都会分为"递推"和"回推"两个过程,可是我怎么总感觉hanoi函数中只有"递推"的过程而没有"回推"的过程.
例如:当N=3在main()函数中第一次调用hanoi函数时,会调用hanoi(3-1,one,three,two).....如此下去,直到N=1为止.那么,然后呢?如何确定第二个盘的移动呢?
以上就是我目前的几个问题....
朋友们啊~~~帮帮忙吧!
最近,我也有所突破了,但是还是有些不踏实,我想听听大家用自己的话来说说自己对这个问题的
理解!
谢谢!

hanoi(n,a,b,c)
int n;
char a,b,c;
{if (n==1) printf("%c-->%c\n",a,c);
else {hanoi (n-1,a,c,b);
printf ("%c-->%c\n",a,c);
hanoi (n-1,b,a,c);}
}
我给你详细解释下这个程序中的代码吧。我也是刚学,希望对你有用。可能有些不好之处,还希望谅解。

先说下这个问题的整体思想:
1,如果只有1个盘,那么就直接把这个盘从A移动到C上。

2,如果存在两个盘,那么先把第一个盘移动到B上,在把最下面一个盘移动到C上,在把B上的盘移动到C上。

3,这样,我们可以得出一个结论,如果存在N个盘,可以先把上面N-1个盘通过C 移动到B上,然后把第N个盘移动到C上, 再把B上的N个盘通过A移动到C上。

if (n==1) printf("%c-->%c\n",a,c);
这一句,表示只有1个盘子的时候,那么就是把第一个盘子直接移到第三个盘子上。

else {hanoi (n-1,a,c,b);
如果超过一个盘字,则需要先把N-1个盘子通过C 移动到B上。

printf ("%c-->%c\n",a,c);
把剩下的第N个盘,从A移动到C上。

hanoi (n-1,b,a,c);}
再把剩下的在B上的N-1个盘,通过A移动到C上。

这属于一个递归算法。
现在,N=3。
我们看下程序怎么运行的。
else {hanoi (n-1,a,c,b);
printf ("%c-->%c\n",a,c);
hanoi (n-1,b,a,c);}

N=3,也就是开始程序会执行