C语言案例---汉诺(Hanoi)塔问题
2020.08.14
C语言分享
●
●
●
#01#前言
C语言案例---汉诺(Hanoi)塔问题【引】
【汉诺(Hanoi)塔问题】据说创世纪时Benares有一塔波罗教塔,是由三支钻石棒(Pag)所支撑,开始时神在第一根棒上放置64个由上至下依次由小至大排列的金盘(Disc),并命令僧侣将所有的金盘从第一根石棒移至第三根石棒,且搬运过程中遵守大盘子在小盘子之下的原则,若每日仅搬一个盘子,则当盘子全数搬运完毕之时,此塔将毁损,也就是世界末日来临之时。
既:
将塔座A上的圆盘移动到塔座C上。
规则:1. 每次移动一个圆盘;
2. 圆盘只能在塔座A,B,C之间移动;
3. 大圆盘不能放在小圆盘上。
C语言案例---汉诺(Hanoi)塔问题--递归应用
1、对于汉诺塔问题,当只移动一个圆盘时,直接将圆盘从 A 塔座移动到 C 塔座。若移动的圆盘为 n(n>1),则分成几步走:把 (n-1) 个圆盘从 A 塔座移动到 B 塔座(借助 C 塔座);A 塔座上的最后一个圆盘移动到 C 塔座;B 塔座上的 (n-1) 个圆盘移动到 C 塔座(借助 A 塔座)。每做一遍,移动的圆盘少一个,逐次递减,最后当 n 为 1 时,完成整个移动过程。
2、所以,解决汉诺塔问题可设计一个递归函数,利用递归实现圆盘的整个移动过程。
本文分成三部分:
1、例子介绍
2、具体代码及说明
3、讨论区
#OVER#
#02#具体代码及说明
#include <stdio.h>
int i=1;
void Hanoi (int n, char X, char Y, char Z)
{// n表示需要移动盘子的数量,X表示源塔,Y表示借用塔,Z表示目标塔
if(n==1) // 只有一个盘子时,将其从X塔移动到Z塔
printf("%d:%c->%c\n",i++,X,Z);
//c++写法:cout<<X<<"->"<<Z<<"\t";
else
{
//①借助Z塔,将前n-1个盘子从X塔移动到Y塔
Hanoi (n-1, X, Z, Y);
//②将X塔上剩下的1个盘子移到Z塔
printf("%d:%c->%c\n",i++,X,Z);
//c++写法:cout<<X<<"->"<<Z<<"\t";
//③借助X塔,将前n-1个盘子从Y塔移动到Z塔
Hanoi (n-1, Y, X, Z);
}
}
int main(void)
{
int gg;
printf("请输入需要移动的盘子的数量:\n");
scanf("%d",&gg);
char x='a',y='b',z='c';
Hanoi (gg,x,y,z);//调用函数
printf("完成!\n");
return 0;
}
#OVER#
#03#运行结果
请输入需要移动的盘子的数量:
3
1:a->c
2:a->b
3:c->b
4:a->c
5:b->a
6:b->c
7:a->c
完成!
#OVER#
了解更多点击下方搜索汉诺塔即可阅读课件
【图片来源:成都向上】
●
●
●
视频来源:科学大世界
文字:科学大世界
文章封面图:网络
图片:网络【图片下方已标明】
部分引用:学校课件并标识【引】
转载请声明:科学大世界
😘😘😘
觉得不错点个在看呗
2020/08/14