汉诺塔问题是经典的函数递归的问题,我当初刚学的时候也是不会,但是现在回头看看,反而觉得很简单。 我觉得解决函数递归的关键就是不要将问题复杂化,学会用递归将复杂的问题简单化才是解决问题的关键; 而递归问题,主要是两个关键点,一是找到递归方程式,知道程序将要如何完成递归,第二是要知道递归结束的条件。
解题思路:
其实用整体思想来看就很简单了,输入盘子的数量当只有一个盘子的时候直接调用move函数将盘子从A移动到C就可以了,但是如果不止一个盘子时,将最下面的一个盘子上面的所有盘子都看做n-1,那么首先递归将上面的所有盘子从A借C放在B上面,然后此时A上就只有一个盘子,也就是最后一个盘子,那么此时再时候Move函数,将A上的盘子移动到C上即可,接着,将刚才放在B上的盘子,再借A不断递归放在C上,那么就完成了;
代码实现:
void Move(char a,char b)
{
printf("%c->%c\n",a,b);
}
void hanio(int n,char a,char b,char c)
{
if(n==1)
{
Move(a,c);//当只有一块盘子,直接移动到C上面
}
else
{
hanio(n-1,a,c,b);//将n-1个盘子先借c放在b上
Move(a,c);//此时a上就一个盘子,直接放到c上
hanio(n-1,b,a,c);//将n-1个盘子从b借a放到c上
}
}
int main()
{
int n;
printf("请输入盘子的数量:\n");
scanf("%d",&n);
hanio(n,'a','b','c');
}
输入3,运行结果