话不多说直接上代码
#include
void Move(int n ,char from ,char to){
printf("%c -> %c\n",from,to);
}
void hanoi(int n ,char from,char depend,char to){
if (n == 1) {
//当剩一个盘子的时候,直接移动到目的柱
Move(1, from, to);
}else{
hanoi(n-1,from,to,depend);//将初始柱的前n-1个盘子借助目的塔移动到借用柱上
Move(n,from,to); //将剩下的一个盘子移动到目的柱上
hanoi(n-1,depend,from,to);//将b柱n-1个盘子移动到借用a柱移动到c上
}
}
int main() {
int n;
scanf("%d",&n);
char x = 'A',y = 'B',z = 'C';
printf("盘子移动情况如下:\n");
hanoi(n, x, y, z);
}
思路:
不管多少个盘子(一个盘子的时候除外),全部都看作是两个盘子
即 最下面的那一个,和其上面的(n-1)个。
这样两个盘子的时候,移动就非常简单了。
总共有三步:
1.将第一个(也就是n-1)个盘子借助C柱从A柱移动到B柱。
2.将最下面的那一个盘子直接从A柱移动到C柱。
3.最后将B柱的那些(n-1)个盘子借助A柱移动到C柱。
所以在入口参数的时候需要,起始柱,借助柱(有点绕口),目的柱。
刚开始可能有些看不太懂,可以先输入几个简单的数,用断点调试,看一下他的移动过程。
递归函数的终点就是只剩一个盘子的时候,直接移动到目的柱。
如果明白了就不用看我下面的废话了
假设有64个盘子,那么问题就成了移动63和最下面的盘子。分成了两组去完成我上述说的那三步。
接着63个盘子去做第一步时就已经开始了递归。
递归到下一级时,就意味着再把63个盘子看成一个整体。分成两部分,最下面的一块和上面的62块。去完成这件事,以此类推,直到第一块。
因为只有前62块都完成移动,才可以移动到第六十三块。
不要去想着这个过程,很容易绕晕的,只需要知道这个函数的功能就是移动盘子。
***下篇博客写汉诺塔非递归算法,c语言实现。 ***
参考博客
https://blog.csdn.net/csshuke/article/details/82630311