【递归】汉诺塔问题

问题描述

有三个命名为x,y,z的塔座,x上有n个半径从小到大编号为1-n的圆盘,要求按相同顺序移动到z上,要求:
1)一次只能移动一个;
2)不可以将一个较大的圆盘压在较小的圆盘之上。

思路

先考虑特殊情况,n=1时直接移,n=2时先把上面一个移到辅助塔,再把另一个移到目标塔,再将第一个移到目标塔。同理,n>2时都可将类比为n=2的情形(将上面n-1个等效为“1”个就可)。由此,可将n个塔的问题转换为n-1个塔的问题,又可转换为n-2个塔的问题…最终转换为1个塔的问题。

算法实现

函数部分

void move(char x,int n,char z)
{
printf("将编号为%d的圆盘从%c移到%c上",n,x,z);
}//定义移动函数
void haoni(int n,char x,char y,char z)
{
if(n==1)
move(x,1,z)
else
{
haoni(n-1,x,z,y);//将1~n-1个圆盘借助z轴,从x轴移到y轴上
move(x,n,z);//将第n个圆盘从x轴移到z轴上
haoni(n-1,y,x,z);//将1~n-1个圆盘借助x轴,从y轴移到z轴上
}
}
//递归:算法的精髓部分

主函数

int main()
{
int n;
char x,y,z;
    x='x';
    y='y';
    z='z';
scanf("%d",&n);
haoni(n,x,y,z);
return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值