比利时总统访问印度:请教一下c语言汉诺塔问题代码不明白之处

来源:百度文库 编辑:偶看新闻 时间:2024/04/27 20:01:27
哈哈,给你解释下
首先你得明白这是用函数递归调用的方法,递归就不用我说了,看代码
void hanoi(int n,char one,char two,char three)
{
void move(char x,char y);
if(n==1)
move(one,three);
//这个if语句,当盘子只有一个的时候,当然直接从第一根柱子(one)移到第//三根柱子(three)上就OK了,move(one,three)就这个意思!

else
{
hanoi(n-1,one,three,two);//当有n个盘子,按照递归法,调用hannoi,先把//上面的n-1个盘子从第一根柱子(one)借助第三根柱子(three)移到第二根柱//子上(two)。

move(one,three);//上面已把n-1个盘子移到第二根柱子上了,再将第一根柱//子剩下的一个盘子也就是最大的盘子从one移到three,明白?

hanoi(n-1,two,one,three);
/*移动好了最大的一个盘子,剩下n-1个盘子在two上,这时我们可以把第二根柱子与第一个柱//子的位置交换下,也就是标号为two的排第一,one排第二,three排第三。
这里的hanoi(n-1,two,one,three)对应
void hanoi(int n,char one,char two,char three),只是盘子变成n-1
个,标号为two的柱子排第一了,下面要做的就是把two上上面的n-2个盘子借助three移到one上,再把剩下的一个移到第三个,再调换one 和two位置。
如此重复!注意转换位置只是我们头脑中的想象,程序本身没有转换柱子位置,编程完全按照标号(one two three)来实现的,我这样写只是便于理解递归过程,不知道是否理解?*/

}
}
void move(char x,char y)
{
printf("%c-->%c\n",x,y);
}
/*move 函数只是起到一个打印步骤的作用,one对应‘A’,。。,比如move(one,two),就会打印出A-->B */

上面有些是我自己理解时的一些想法,希望能帮到你,实际你把代码对照算法多看几次就OK了,很容易的,理解了自己都可以写出来