Hanoi塔问题
2017-11-11 00:00
155 查看
Hanoi塔问题——递归方法求解
假设有三个分别命名为x、y、z的圆柱形塔座,在塔座x上插有n个半径大小各不相同,以小到大由上而下编号为1,2,····,n,如图所示。现在要求将X轴上的n个圆盘移至塔Z上并仍按原来的顺序叠放,圆盘移动时必须遵循以下规则:
1.每次只能移动一个圆盘
2.圆盘可以插在X、Y、Z任意一个塔座上
3.任何时刻都不能将一个较大的圆盘压在较小圆盘之上
如何实现圆盘的移动呢?这就要用到我们强大的递归思想。设一个变量n用来调用任意一个圆盘,当n=1时,只要将一号圆盘从X上移动到Z上即可;当n>1,需要利用Y做中间塔,若能设法将压在n号盘上的n-1个圆盘从X移至Y上,然后再将n号盘移到Z上,最后将Y上的n-1个圆盘移到Z上即可!而整个过程中对那n-1个圆盘进行的两次整体操作都可以分别作为一个完整的Hanoi问题。
由此求解的C函数如下:
void move(char a,int n,char c)
{
//此函数的操作为:将a塔上编号为n的圆盘移至c塔上
//此处省略若干字。。。
}
void Hanoi(int n,char a,char b,char c)
//将塔座a上的n个圆盘搬到c上,b作为中间塔
{
if(n==1)move(x,1,z);
else
{
Hanoi(n-1,x,z,y);
move(x,n,z);
Hanoi(n-1,y,x,z);
}
}
可以看出,整个程序都不需要用到实际用于存放Hanoi塔的存储空间(因为算法与客观存在的数据无关嘛),所以move函数可以写成:printf(“将%i号盘从%c塔移到%c塔”,n,a,c);
假设有三个分别命名为x、y、z的圆柱形塔座,在塔座x上插有n个半径大小各不相同,以小到大由上而下编号为1,2,····,n,如图所示。现在要求将X轴上的n个圆盘移至塔Z上并仍按原来的顺序叠放,圆盘移动时必须遵循以下规则:
1.每次只能移动一个圆盘
2.圆盘可以插在X、Y、Z任意一个塔座上
3.任何时刻都不能将一个较大的圆盘压在较小圆盘之上
如何实现圆盘的移动呢?这就要用到我们强大的递归思想。设一个变量n用来调用任意一个圆盘,当n=1时,只要将一号圆盘从X上移动到Z上即可;当n>1,需要利用Y做中间塔,若能设法将压在n号盘上的n-1个圆盘从X移至Y上,然后再将n号盘移到Z上,最后将Y上的n-1个圆盘移到Z上即可!而整个过程中对那n-1个圆盘进行的两次整体操作都可以分别作为一个完整的Hanoi问题。
由此求解的C函数如下:
void move(char a,int n,char c)
{
//此函数的操作为:将a塔上编号为n的圆盘移至c塔上
//此处省略若干字。。。
}
void Hanoi(int n,char a,char b,char c)
//将塔座a上的n个圆盘搬到c上,b作为中间塔
{
if(n==1)move(x,1,z);
else
{
Hanoi(n-1,x,z,y);
move(x,n,z);
Hanoi(n-1,y,x,z);
}
}
可以看出,整个程序都不需要用到实际用于存放Hanoi塔的存储空间(因为算法与客观存在的数据无关嘛),所以move函数可以写成:printf(“将%i号盘从%c塔移到%c塔”,n,a,c);
相关文章推荐
- Hanoi塔问题的算法
- Hanoi塔问题~~~答案竟然是二叉树的中序遍历
- Hanoi塔问题
- hanoi塔问题(经典递归)
- 递归实现hanoi塔问题算法
- Hanoi塔问题
- 对Hanoi塔问题的理解
- 一步一步写算法(之Hanoi塔问题)
- 算法分析——Hanoi塔问题
- 经典算法系列---hanoi塔问题
- hanoi塔问题解析(一) c++实现
- 汉诺塔问题(Hanoi塔)
- Hanoi塔问题(C)
- [导入]Hanoi塔问题(C)
- hanoi塔问题的递归实现
- 双色Hanoi塔问题及判断指令
- algo3-3-10.c Hanoi塔问题 (没仔细看)
- 递归法解决Hanoi塔问题
- Hanoi塔问题
- 栈与递归的实现(Hanoi塔问题等等)