下载此文档

C汉诺塔问题.doc


文档分类: | 页数:约2页 举报非法文档有奖
1/2
下载提示
  • 1.该资料是网友上传的,本站提供全文预览,预览什么样,下载就什么样。
  • 2.下载该文档所得收入归上传者、原创者。
  • 3.下载的文档,不会出现我们的网址水印。
1/2 下载此文档
文档列表 文档介绍
C语言汉诺塔问题
递归算法的出发点不是由初始条件出发,而是把出发点放在求解的目标上,从所求的未知项出发逐次调用本身的求解过程,直到递归的边界(即初始条件)。
汉诺塔问题的重点是分析移动的规则,找到规律和边界条件。
若需要将n个盘子从A移动到C就需要
(1)将n-1个盘子从A移动到B;
(2)再将第n个从A移动到C;
(3)再将n-1个盘子再从B移动到C,这样就可以完成了。如果n!=1,则需要递归调用函数,将A上的其他盘子按照以上的三步继续移动,直到达到边界条件n=1为止。
思路清楚了,程序就好理解了。程序中的关键是分析好每次调用移动函数时具体的参数和对应的A、B、C塔的对应的关系。下面来以实际的例子对照程序进行说明。
①move(int n,int x,int y,int z)
②{
③ if (n==1)
④ printf("%c-->%c\n",x,z);
⑤ else
⑥{
⑦ move(n-1,x,z,y);
printf("%c-->%c\n",x,z);
move(n-1,y,x,z);
}
}
比如有4个盘子,现在全部放在A塔上。盘子根据编号为1、2、3、4依次半径曾大。现在要将4个盘子移动到C上,并且是按原顺序罗列。首先我们考虑如何才可以将4号移动到C呢?就要以B为中介,首先将上面的三个移动到B。此步的操作也就是程序中的①开始调入move函数(首次调用记为一),当然现在的n=4,然后判断即③n!=1所以不执行④而是到⑤再次调用move函数(记为二)考虑如何将3个盘移动到B的方法。此处是递归的调用所以又一次回到①开始调入move
函数,不过对应的参数发生了变化,因为这次要考虑的不是从A移动4个盘到C,而是要考虑从A如何移动移动3个盘到B。因为n=3,故不可以直接移动要借助C做中介,先考虑将两个移动到C的方法,故再一次到⑤再一次递归调用mo

C汉诺塔问题 来自淘豆网www.taodocs.com转载请标明出处.

相关文档 更多>>
非法内容举报中心
文档信息
  • 页数2
  • 收藏数0 收藏
  • 顶次数0
  • 上传人mh900965
  • 文件大小30 KB
  • 时间2018-03-10