【推荐下载】()Hanoi塔问题的递归方法与非递归方法(java实现)
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
(原创)Hanoi 塔问题的递归方法与非递归方法(java 实现) 2015/11/18 135950 本文讨论了Hanoi 塔问题的递归方法与非递归方法,给出
了java 实现的代码,并比较了它们的效率。
法国数学家爱德华·卢卡斯曾编写过一个印度的古老传说:在世界中心贝拿勒斯
(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。
印度教的主神梵天在创
造世界的时候,在其中一根针上从下到上地穿好了由大到小的64 片金片,这就是所
谓的汉诺塔。
不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次
只移动一片,不管在哪根针上,小片必须在大片上面。
僧侣们预言,当所有的金片
都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵
塔、庙宇和众生也都将同归于尽。
文章中我们假设汉诺塔个数为正整数n,三个盘子为A,B,C,其中C 是中介盘,我
们要遵守移动规则将A 上的盘子要全部通过C 移动到B。
1.递归方法如果汉诺塔上盘子个数n=1 时显然直接将A 上的盘子移动到B 即可,当n=2 时,方法也很简单,只要将第一块盘子先从A 移动到C,再将第二块盘子
从A 移动到B,再将第一块盘子从C 移动到A。
实际上,表达的时候不必要强调第几
块盘子,而只需要像从A 移动到B 这样描述,也能清楚的知道意思(因为总是只能移
动每个汉诺塔最顶上的盘子)。
那么n=2 时解决办法的表示就是:A- C,A- B,C- B。
下
面我们都采用这种简洁明了的表示。
要知道如何将n 块盘子从A 通过C 移动到
B,我们可以先将上面的n-1 块盘子从A 通过B 移动到C,再将最大的盘子从A 移
动到B,这时再将上面的n-1 块盘子从C 通过A 移动到B。
这就是递归算法解决
Hanoi 塔问题的思路。
代码如下:
/** * 将A 汉诺塔上的n 个盘子通过C 移动到B 的递归方法* @param n //汉诺
塔上盘子的个数* @param A //开始时有盘子的汉诺塔* @param B //要将盘子移动
到上面的目标汉诺塔* @param C //中介汉诺塔* @throws IllegalArgumentException when n =0 */ public static void HanoiTowers1(int n,char A,char B,char C){ if(n =0){ throw new IllegalArgumentException(“n must be =1”);} if(n==1){。