内容发布更新时间 : 2025/1/9 11:13:57星期一 下面是文章的全部内容请认真阅读。
共享知识 分享快乐
汉诺塔递归算法C语言动态演示
汉诺塔递归算法具体演示功能: ①任意输入演示的个数;
②选择电脑自动演示和手动单步执行两种方式;
③若选择电脑自动演示请输入速度;
④屏幕上显示算法执行过程。
演示算法流程图:
汉诺塔模块编码:
汉诺塔问题是一个经典的递归问题。它给出的圆盘移动条件是:一次仅能移动一个盘,且不允许大
盘放在小盘的上面[1]。
算法演示思想[10]:设要解决的的汉诺塔共有N个圆盘,对A杆上的全部N个圆盘从小到大顺序编号,
最小的圆盘为1号,次之为2号,依次类推,则最下面的圆盘的编号为N。
卑微如蝼蚁、坚强似大象
共享知识 分享快乐
第一步:先将问题简化。假设A杆上只有一个圆盘,即汉诺塔只有一层N
A杆上移到B杆上即可。
第二步:对於一个有N(N>1)个圆盘的汉诺塔,将N个圆盘分成两部分:上面的N-1个圆盘
和最下面的N号圆盘。
第三步:将“上面的N-1个圆盘”看成一个整体,为了解决N个圆盘的汉诺塔,可以按下面图示的
方式迳行操作:
1、将A杆上面的N-1个盘子,借助B杆,移到C杆上;
1,则只要将1号盘从
2、 将A杆上剩余的N号盘子移到B杆上;
3、 将C杆上的N-1个盘子,借助A杆,移到B杆上。
按照上面的想法,我们要演示的就是具体的移盘操作。
关键技术:画盘子 、移盘、显示移盘步骤
实现步骤: 1、画盘子;
2、移盘、显示移盘步骤。
卑微如蝼蚁、坚强似大象
共享知识 分享快乐
核心代码实现如下: n 画盘子 首先定义一下盘子的结构:
struct H
{
int data[15];/*存放每个盘的代号*/ int top;/*每个塔的具体高度*/
}num[3];/*三个塔*/
接下来要定义一些标志变量来判断运行方式,比如: int computer=1;/*自动控制与手动控制的标志*/ int speed=0;/*全局变量speed主要是演示过程的速度*/
然后要处理输入数据越界的情况,因为盘子个数过多,将很难实现,因此这里以0 界的话n当10处理。代码如下: … if(n<1||n>10) n=10;/*越界的话n当10处理*/ … 下面来开始画盘子: 首先初始化三个地方塔的高度,代码如下: … for(i=0;i<3;i++) num[i].top=-1;/*三个地方的高度开始都为-1*/ … 然后画一开始的塔座A上的盘子,代码如下: …