这个问题我当年摸索了2个多小时才彻底弄懂。。。分献给你。。
void move(char x,char y); /*对move函数的声明*/
if(n= =1)
move(one,three); //如果只有一个盘子,只需要将第一个搬到第三个柱子上就完成任务了
else//如果还有n(n != 1),只需要三步就可以完成
{
hanoi(n-1,one,three,two); //步骤1:把上面的n-1个通过第三个柱子搬到第二个柱子上去
move(one,three); // 步骤2: 把最下面的那个大盘子N移动到第三个柱子上去
hanoi(n-1,two,one,three);//步骤3: 把第二个柱子上面的n-1个盘子通过第一个移动到第三个柱子上去
}
}
void move(char x,char y) /*定义move函数*/
{
printf(“%c――>%c\n”,x,y);; //move就不用多说了,cong柱子x到 y
}
① 把A柱上n-1个圆盘移到B柱上(借助C柱);
② 把A柱上剩下的一个圆盘移到C柱上;
③ 把B柱上n-1个圆盘移到C柱上(借助A柱)。
当盘数变为n-1时又相当于一个n-1个盘移动的新汉诺塔
事实上,上面三个步骤包含两类操作:
1.将n-1个盘子从一个针移到另一个针上(n>1),这是一个递归的过程;
2.将1个盘子从一个针上移到另一针上(base case)。
以下是代码:
#include
void tower(int c,char start,char temp,char end)
{
if(c==1)
printf("%d:%c --> %c\n",c,start,end); //若盘数为1则直接移动过去
else
{
tower(c-1,start,end,temp); //第一次将n-1个盘子移至辅助盘b
printf("%d:%c-->%c\n",c,start,end); //将第n个盘子移至c
tower(c-1,temp,start,end); //将n-1个盘子移动至c
}
}
void main()
{
char start,temp,end; //分别为第一、二、三个柱子
start='A';
temp='B';
end='C';
tower(3,start,temp,end); //3表示待移动的盘子
}
C语言,谭浩强的第三版176页。上面的人说的很清楚,但这个问题主要是应用递归调用,把递归调用好好看看。问题自己理解的才能掌握。给你思路当n大于1时需要借用第二个盘子把底下最大的放到c上,n-1现在就到b上了。在把b看成a一样。借助a把b上的最后一个移到c上。这里来回循环就是一个递归调用。好好好好想想慢慢理解就好了