汉诺塔问题求解
- 第一次移动,把A柱子上的前n-1个移动到B柱子上,借助C柱
- 第二次移动,直接把A柱子上的最后一个移动到C柱子上
- 第三次移动,把B柱子上的n-1个柱子通过柱子A移动到柱子C上
此题要通过递归,而递归的主要思想就是化繁为简,比如:移动3个盘子就相当于移动两个盘子,再移动一个盘子,移动4个盘子就相当于移动三个盘子,而移动3个盘子就又回到了前面.这其实就是递归的思想.
递归两个根本条件
- 要有结束条件
- 每次递归后要能逐渐逼近这个结束条件
对比汉诺塔
- 结束条件=将A柱上所有盘子都移到C柱上
- 逼近结束条件=将A借助B移到C,将B借助A移动到C,一句话,就是每次都从A-C,每次都在不断接近(就是每次移动一个盘子)
实际上只需要跟着这三次移动,写出相应的代码即可.
#include<stdio.h>
int count=0;//全局变量算总移动次数
//只从起始处移到目的地
void Move(int plates_num, char start, char end)
{
count++;
printf("The %dst Move: %c -> %c\n",count,start,end);
}
void get_Hanoi(char start,char tool,char end,int plates_num)
{
if(plates_num==1)//如果只有一个盘子要移动,那么直接放到C柱
{
Move(plates_num,start,end);
}
else
{
get_Hanoi('a','c','b',plates_num-1);//第一次移动,把A柱子上的前n-1个移动到B柱子上,借助C柱
Move(plates_num,'a','c');//第二次移动,A移到C
get_Hanoi('b','a','c',plates_num-1);//第三次移动,把B柱子上的前n-1个移动到C柱子上,借助A柱
}
}
void main()
{
int plates_num;
printf("plates=");
scanf("%d",&plates_num);
get_Hanoi('a','b','c',plates_num);
}
我觉得其实很多人被绕进去是因为自己定义的变量名.如果你起点简单移动的变量名,对吧,就要好理解的多.
如有问题,欢迎指正