1问题描述
问题提出:有三个塔(分别为A号,B号和C号)。开始时.有
n个圆形盘以从下到上、从大到小的次序叠置在A塔上。现要将A
塔上的所有圆形盘,借助B搭,全部移动到C搭上。且仍按照原来
的次序叠置。
移动的规则如下:这些圆形盘只能在3个塔问进行移动.一
次只能移动一个盘子,且任何时候都不允许将较大的盘子压在比
它小的盘子的上面。
要求如下:从键盘输入初始圆形盘子个数n.用JAVA实现n
个盘子最佳移动的全过程。
2算法分析
此题的目的是设计一个盘子移动的方案.使得A号塔上的所
有盘子借助于B号塔按照原来的次序移动到C号塔上,并且.要
给出完整的最佳的盘子移动的方案。
我们从实际的、具体的盘子的移动过程来分析.找出问题内
在的规律。经分析无论盘子的个数有多少.是1、2、3..或n个.
也不管我们怎么去移动盘子(当然是按规则来移动).但在移动的
过程中,将始终会出现这样的状态情况:(n一1)个盘子将会以从下
到上、从大到下的次序叠置在B塔上,这时,A塔上第n个盘子就
能被轻而易举叠放到c塔上;接着,我们再把B塔上的其fn一1)十
盘子移动到C塔上,问靼好像已经解决
但,B塔上fn—1)个盘子怎么移动到C塔上呢?这是我们要解
决的第二个问题。同样,不管我们怎么移动,也将会出现这样的状
态情况:(n一2)个盘子将会以从上到下、从大到小的次序叠置在A
塔上,这时。B塔上第(n一1)个盘子就能被轻而易举放到C塔上;接
着,我们把A塔上的共(n一2)个盘子移动到C塔上。
这样,不断深入,不断细小化,最终,将到达仅有一个盘的情
形。这时,递归也就终止了,问题也得到了解决。通过以上分析.这
里有很明显递归关系
由此,想到了采用递归算法来解决该问题。因为递归算法有这
样特征描述:为了求解出规模力N的问题的解.我们先设法将它分
解成一些规模较小的问题,然后从这些较小问题的解能方便地构
造出大问题的解,并且这些规模较小的问题也能采用同样的方法
分解,分解成规模更小的问题,并能从这些更小的问题的解构造出
规模稍大问题的解。特别地是,当规模N-I时,能直接得到解。
现在,严格按照递归算法来解决问题。先定义递归方法Hanio
(int N,char A,char B,char C),按如下步骤进行解题(设初始盘子个
数为N):若A塔上仅仅只有一个盘子(N=1),则直接从A移动到
C,问题完全解决。若A塔上有一个以上的盘子(N>1),则需要考虑以下三个步骤。
第一步:把 一1)个盘子从A塔经过移动,叠放到B塔上。在
不违反规则情况下,所有fN一1)个盘子不能作为一个整体一起移
动,而是要符合要求地从一个塔移到另一个塔上。用Hanio(N—1.A,
C,B)调用递归方法,注意:这里是借助于C塔,将(N一1)个盘子从A
塔移动到B塔,A是源塔,B是目标塔。
第二步:将剩下的第N个盘子(也就是最底下的一个)直接从A塔
叠放到空着的C塔上。
第三步 用第一步的方法,再次将B塔上的所有盘子叠放到
C塔上。同样,这一步实际上也是由一系列更小的符合规则的移动
盘子的操作组成的。用Hanio(N一1,B,A,C)调用递归方法,注意:这
里是借助于A塔,将(N—1)个盘子从B塔移动到C塔,B是源塔,℃
是目标塔。
这个算法达到了预期的目标.即在C塔上按正确的次序叠放
了所有的圆形盘子。有了前面问题算j去分析的基础,继而,我们可
以用JAVA来实现算法。
3 JAVA实现
3.1说明如下
(1)n为A塔初始盘子个数;
(2)A塔上盘子从上到下、从小到大编号依次为l,2,3. . :
(3)Hanio0方法采用递归算法,实现盘子移动的最佳方案:
(5)InputnO方法实现盘子个数n的键盘输入(输入必须为阿
拉伯数字)。
3.2编程如下
import java.io. ;,/引用java包的io子包的所有公有类
public class Hanio//Hanio类的声明
{static int n;
public static void main(Strin乱J args)throws IOException
I System.out.print(”请输入盘子的个数lI=”);
n=Integer.parselnt(Inputn0);
System.out.prindn(”盘子的整个移动过程如下.I ;
Hanio(n, A , B , C );,/调用Hanio方法l
#HanioO方法采用递归算法
public static void Hanio(int N,char A,char B,char C)
{if(N==1)
System.out.prlntln(”Dish l from”+A+”to”+C);
else ·
{Hanio(N—l,A,C,B);//把A上的N一1个盘子借助于C叠放刘
B上
System.out.println(”Dish”+N+”from”+A+”to“+C):
Hanio(N一1,B,A,C);//再把B上的N—1个盘子借助于A叠放到
C上
ll ,,读从键盘输入的数据流的方法
public static String InputnO throws IOException
{String str;
BuferedReader Input=new BuferedReader fnew InputStream.
Reader(System.in11;
str=Input.readLine0;
retum str;}l
3.3编译、解释运行iava程序
上面的代码可以使用记事本录入,保存文件名为Hanio.java。
在运行iava程序前首先使用编译程序iavac进行编译,通过后再
使用java运行即可。具体的命令操作如下。
(1)编译程序
C:\java>javac Hanio.java
编译成功后生成类文件Hanio.class
(2)运行程序
C:\java>java Hanio
注:编写iava程序的运行环境必须安装JDK工具包,并进行
配置.可以从WWW.java.com下载。
4总结
其实。递归算法的执行过程分为递推和回归两个阶段。在递推阶段,把较为复杂的问题(如规模为N)的求解推到比原问题简
单一些的问题(规模小于N)的求解。’例如上面分析过程中,为求
解Hanio(N,A,B,C),推到计算Hanio(N一1,A。C。B)。
在回归阶段,当获得最简单情况的解后,逐级返回。依次获得
稍复杂问题的解。在这里的“汉诺塔”问题中,有它的特别的地方,
回归的过程当中.还要涉及到递推。
另外.在编写递归方法时要注意是:每次调用递归方法,方法
中的参数只是局限于当前调用层的,当递推进入“简单问题”层
时,原来层次上的参数便被隐藏起来。在一系列“简单问题”层,它
们各有自己的参数。 .
最后.通过经典“汉诺塔”问题移动过程的分析、解决以及最
后JAVA编程实现,使我们能够掌握解决此类问题的方法,也使
我们对递归算法能有个更加深刻的理解。
分享到:
相关推荐
### 汉诺塔问题详解 #### 一、汉诺塔问题概述 汉诺塔问题是一种经典的递归问题,最早由法国数学家爱德华·卢卡斯在1883年提出。它是一个用于训练逻辑思维能力和递归算法理解的经典案例。汉诺塔问题描述如下:有三...
### 递归实现汉诺塔程序详解 #### 汉诺塔问题背景介绍 汉诺塔(Tower of Hanoi)是一种源自古老传说的数学游戏,它由三根柱子及不同大小的圆盘组成。游戏的目标是将所有圆盘从一根柱子移到另一根柱子上,每次只能...
### 汉诺塔(Hanoi Tower)问题详解与C++实现 #### 一、汉诺塔问题背景介绍 汉诺塔(Tower of Hanoi),又称河内塔,是一个源自印度古老的数学游戏。该问题由法国数学家爱德华·卢卡斯于1883年发明,并以其富有...
### 汉诺塔问题详解及Python实现 #### 一、汉诺塔问题背景与定义 汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的经典问题。根据传说,印度某寺庙中有一块铜板,上面插着三根杆子,杆子上...
### 汉诺塔C语言实现详解 #### 一、汉诺塔问题背景与规则 汉诺塔(Hanoi Tower)问题是一个经典的递归问题,起源于一个古老的传说。传说中,印度的一个寺庙里有一组梵塔,由三个塔座(A、B、C)组成,其中A座上放...
"汉诺塔问题C++递归详解" 汉诺塔问题是一个经典的递归问题,它的解决方案可以使用C++语言来实现。在这个问题中,我们需要将一些圆盘从起始柱移到目标柱,规则是小圆盘不能放在大圆盘上,并且每次只能移动一个圆盘。...
### 递归实现:汉诺塔问题 #### 经典问题背景 汉诺塔(Hanoi Tower)问题是一个经典的递归问题,源自一个古老的故事。传说在印度的一个神殿里,有三根金刚石柱子,第一根柱子上自上而下按大小顺序叠着64个金盘。...
汉诺塔迭代算法详解 迭代算法提供了一个无需递归调用就能解决问题的方法。为了简化计算,我们可以将针编号为1、2、3,并将圆盘按照大小编号为1至n。下面详细介绍迭代算法的实现步骤。 ##### 3.1 移动次数的计算 ...
汉诺塔问题是一个经典的递归算法问题,它源自印度的一个古老传说,旨在通过演示如何将一组盘子从一根柱子移动到另一根柱子来解释宇宙的起源。在这个问题中,我们有三根柱子A、B和C,以及N个大小不一的盘子,初始时...
【VB汉诺塔问题详解】 汉诺塔(Hanoi Tower)问题是一个经典的递归问题,源于19世纪由法国数学家爱德华·卢卡斯提出。VB(Visual Basic)是一种广泛使用的编程语言,用于创建Windows应用程序。在VB中实现汉诺塔问题...
### 汉诺塔Python详解及其学习意义 #### 汉诺塔问题概述 汉诺塔(Hanoi Tower)是一个著名的数学谜题,最初由法国数学家爱德华·卢卡斯于1883年发明。这个谜题不仅具有很高的趣味性,而且在计算机科学领域也有着...
### 汉诺塔搭法图解:4盘搭法详解 #### 一、汉诺塔简介 汉诺塔(Hanoi Tower),又称河内塔、汉诺伊塔,是一种源自19世纪末法国的数学游戏。游戏由三根柱子及不同大小的圆盘组成,目标是将所有圆盘按照特定规则从...
三色汉诺塔是一种基于传统汉诺塔问题的变种。在传统的汉诺塔问题中,玩家需要将一叠不同大小的盘子从一个柱子移动到另一个柱子上,中间可以使用第三个柱子作为辅助。移动过程中必须遵循以下规则:每次只能移动一个...
汉诺塔问题是一个经典的递归问题,在计算机科学中被广泛用于教学递归的概念。该问题描述为:有三个柱子(A, B, C),以及若干个不同大小的盘子,这些盘子最初都放在柱子A上,并且遵循大盘子在下的规则。目标是将所有...
python实现汉诺塔(采用递归的方式),小白极易上手,一看即懂!
汉诺塔问题是一个经典的递归算法示例,在计算机科学领域被广泛应用于教授递归思想和解决复杂问题的方法论。本文通过一个具体的C语言实现版本,来详细阐述如何在C语言环境下模拟汉诺塔的过程。 #### 二、汉诺塔背景...