首页 > 其他 > 详细

递归的经典运用《汉诺塔问题》

时间:2014-02-24 20:16:04      阅读:413      评论:0      收藏:0      [点我收藏+]

学习递归的人应该都知道汉诺塔问题,翻开一些C语言的书几乎都会在递归中提到汉诺塔问题

为了更好的说明汉诺塔问题,我用一张图说明

bubuko.com,布布扣

算法如下所示:

当A柱子上只有一个盘子时

直接将A盘上的盘子移到C盘


当A柱子上有两个盘子时

先将上面的盘子放在B柱子上

再将下面的盘子放在C柱子上


当A柱子上有三个盘子时(盘子由上到下分别为 1号盘子  2号盘子 3号盘子)

bubuko.com,布布扣


第一步:将A柱子上的1号盘子移到C柱子上:

bubuko.com,布布扣


第二步:将A柱子上的2号盘子移到B柱子上

bubuko.com,布布扣


第三步:将C柱子上的1号盘子移到B柱子上

bubuko.com,布布扣


第四步:将A柱子上的3号盘子移到C柱子上

bubuko.com,布布扣


第五步:将B柱子上的1号盘子移到A柱子上

bubuko.com,布布扣


第六步:将B柱子上的2号盘子移到C柱子上

bubuko.com,布布扣


第七步:将A柱子上的1号盘子移到C柱子上


通过以上的算法可以得出的代码:

#include <stdio.h>

void  hannuota(int n,char X,char Y,char Z);

int main()
{
	char ch1 = ‘A‘;//A柱子
	char ch2 = ‘B‘;//B柱子
	char ch3 = ‘C‘;//C柱子
	int n;         //要移动盘子的个数

	printf("请输入要移动盘子的个数:\n");
	scanf("%d",&n);

	hannuota(n,‘A‘,‘B‘,‘C‘);

	return 0;
}

void hannuota(int n,char A,char B,char C)
{
 /*
  如果是一个盘子
       直接将A柱子上的盘子从A移到C
  否则
    1先将A柱子上的n-1个盘子借助C移到B
	2直接将A上的第n个盘子移到C
	3最后将B柱子上的n-1个盘子借助A移到C
 */
	if(1==n)
	{
       printf("将编号为%d的盘子直接从%c移到%c柱子\n",n,A,C);
	}
	else
	{
		hannuota(n-1,A,C,B);
        printf("将编号为%d的盘子直接从%c移到%c柱子\n",n,A,C);
	    hannuota(n-1,B,A,C);
	}
}


执行结果:

当有三个盘子时

bubuko.com,布布扣

递归的经典运用《汉诺塔问题》

原文:http://blog.csdn.net/u010105970/article/details/19696199

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!