#汉诺塔问题
汉诺塔问题是给定三根柱子,这三根柱子分别为A,B,C,初始时柱子A放了n个盘子,从上到下盘子大小以此变大,现在要求将柱子A中的所有盘子放入到柱子C中使得移动的次数最少,移动的过程中需要满足:
(1)每次只能移动一次盘子
(2)上面的盘子要比下面的盘子小
(3)移动的过程中这些盘子可以放A,B,C这三根柱子任意的柱子上
解决汉诺塔问题思路
思路就是通过移动其他上面n-1个盘子将其移动到B柱子上(这期间经历很多步骤,具体的不关注),在将A柱子上最后一个最大的盘子移动到C柱子上,此时还有B柱子上的盘子还没移动如下图所示,但此时发现这不和开始将A的盘子移动到C上的做法是类似的方法只是柱子变了,考虑到这些,这就可以用递归来完成,使用递归来解决问题需要满足两个条件:(1)递归需要有限制条件(2)随着递归的进行越来越接近这个限制条件。
而这个汉诺塔问题刚好满足,以此我们采用递归的方式来解决问题。
代码的实现方式如下:
#include<stdio.h>
void move(char A, char B)
{
printf("从%c移动到%c\n", A, B);//打印盘子的移动情况
}
int hannuo(int a, char A, char B, char C)//使用递归方式来解决汉诺塔问题
{
int num = 0;//用来计算移动的次数的
if (a == 1)
{
move(A, C);
return 1;
}
else
{
num+=hannuo(a - 1, A, C, B);
//不管如何移动n-1个盘子,使得比最大盘子小的n-1个盘子放到B上
move(A, C);//此时将最大的盘子移动到C上
num += 1;//所以num+1
num += hannuo(a - 1, B, A, C);
}
}
int main()
{
int a = 0;
scanf("%d", &a);
printf("盘子的总数%d\n",a);
int num=hannuo(a,'A','B','C');
printf("至少要移动的次数%d\n", num);
return 0;
}
总结:将汉诺塔问题用递归的方式来解决,其核心是不需要关注中间具体是如何操作的,可以将函数hannuo当做一个已经实现好了的黑盒子可以计算从n,n-1...等移动的次数的一个函数,要想计算n个盘子移动的次数,则需要计算n-1个盘子移动的字数...,而限制条件是a==1时可以返回结束继续的递推,紧接着便是一层一层的回归,这也是递归的意思,先递推在回归,所以在实现的时候直接调用函数hannuo以此来实现递归。欢迎请大家批评指正。