汉诺塔相信大家都听过,而且也知道用递归来求解。
今天面试,突然问到这个,并要求写出代码,至少是伪代码。
一下子比较晕。仔细想了下,差点把汉诺塔搞错了。一下来自百科
“汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。”
现在,我们考虑如何使用递归。递归有个特点,那就是,上层把问题交给下层,直到最后可以很快求解时,再递归返回上层,得到答案。这个问题,可以这么理解:
问: n 个圆盘如何移动?
答: 如果知道n-1个圆盘移动顺序,那么我就知道如何移动n个圆盘了
问: n-1个圆盘如何移动?
答: 如果知道 n-2 个圆盘移动顺序,那么我就知道如何移动n个圆盘了。
...
...
...
问: 2个圆盘如何移动?
答: 这个容易,A->C, A->B, B->C
这时,3个圆盘可以移动了,然后4个圆盘也知道移动了,5个……
看代码吧。
public class Hanno {
/**
*
* @param A 起始柱子
* @param B 临时柱子
* @param C 目的柱子
* @param n 未放好的圆盘数量。如果未放好的最大的一个圆盘放到C中最下面,则表示这个圆盘已经放好。
*/
public void move(char A , char B , char C ,int n){
/**
* 小于2个圆盘,无意义。
*/
if(n < 2){
return;
}
/**
* 当圆盘数是2时,我们已经可以轻松的计算出移动顺序了。
*/
if(n == 2){
System.out.println("move from "+A +" to " + B + " ");
System.out.println("move from "+A +" to " + C + " ");
System.out.println("move from "+B +" to " + C + " ");
return;
}
/**
* 这里调整了一下,假设现在未放好的圆盘都在柱子A上。我们把目前圆盘看成两个,最下面的一个和
* 上面的所以看成一个。如何移动最上面的圆盘(被看做一个圆盘)我们不关心(通过递归求解,当最上面的圆盘数为2
* 时,我们可以递归)。我们的目的是把最上面的一个放到B,然后就可以把最下面一个放到C
* 这样就完成了最下面一个的放置。根据函数,我们可以如下表示。
*/
move(A,C,B,n-1);
/**
* 把上面的一摞(或者一个,看做一个)圆盘移动到B以后,我们把A中最后一个圆盘移动到C
* 所以直接移动。
*/
System.out.println("move from " + A + " to " + C );
/**
* 这时的情况是A柱子空了,B柱子变成n-1个圆盘,C柱子上是放好的圆盘了。
* 那么,我们继续移动,把B柱子上的圆盘,移动到C柱子,这里其实等于一开始时,把A和B换一下。
* 对于C柱子,最大的一个圆盘在下面了,所以无论什么圆盘,都可以放上面。可以看成是空的。
* 这样问题转换成求解n-1个圆盘。知道递归到不动点。
*/
move(B,A,C,n-1);
}
public static void main(String args[]){
Hanno hanno = new Hanno();
hanno.move('A', 'B', 'C', 3);
}
这里一个关键是,把柱子上的圆盘看成是两个,有些步骤,不用考虑如何移动,只需要递归到可以求解。
我一开始,也想到了,但是我还是想错了,不能把圆盘分成上面一个单独作为一个,下面的所有看做一个,这样是不行的。只有把下面的看成一个,然后上面的所有看成一个。
并且,移动的时候,按照简单的两个移动的思维,就组成了函数的逻辑。
- 大小: 8.9 KB
分享到:
相关推荐
汉诺塔是一个经典的递归问题,它源自一个古老的印度传说。在这个问题中,有三个柱子和一堆不同大小的圆盘,目标是将所有圆盘从一个柱子移动到另一个柱子,遵循以下规则: 1. 一次只能移动一个圆盘。 2. 不允许将大...
汉诺塔(Hanoi Tower)是一款经典的逻辑游戏,源自19世纪由法国数学家艾德蒙·洛卡特(Edouard Lucas)提出的数学问题。它通常由三根圆柱和一堆不同大小的圆盘组成,玩家的目标是将所有圆盘从一根柱子移动到另一根...
汉诺塔(Hanoi Tower)是一款经典的逻辑益智游戏,起源于19世纪末的法国,由数学家爱德华·卢卡斯提出。在这个游戏中,有三根柱子和一堆大小不一的圆盘,起初都堆在第一根柱子上,按照从大到小的顺序自下而上排列。...
汉诺塔游戏是一种基于递归算法的经典逻辑游戏,源自印度古老传说,由法国数学家爱德华·卢卡斯在19世纪末正式提出。在这个简单的汉诺塔HTML网页游戏中,玩家将体验到如何通过一系列合法移动将全部圆盘从一根柱子...
汉诺塔(Hanoi Tower)是一个经典的递归问题,在计算机科学和编程教育中常被用作教学示例。Android 平台上实现汉诺塔游戏,可以让我们深入理解递归算法、用户界面更新以及数据存储机制。在这个源码中,我们可以看到...
### C经典算法之双色汉诺塔 #### 双色汉诺塔算法解析 双色汉诺塔(Two-color Hanoi Tower)是基于传统汉诺塔游戏的一种变体。传统汉诺塔游戏由三个柱子及不同大小的圆盘组成,玩家的目标是将所有圆盘从初始柱子...
Scratch汉诺塔创意编程源程序汉若塔:由4-8个不同积木块和3根柱子组成游戏规则:1、一次只能移一个积木(柱子最上面)2、积木只能在三个柱子上存放3、任何时刻不允许大的压小的案例完美的诠释了什么是汉诺塔游戏,...
汉诺塔演示程序结合了二叉树的演示动画,为学习和理解这两种计算机科学基础知识提供了一个生动直观的方式。首先,我们来深入探讨一下汉诺塔问题及其解决方案。 汉诺塔是一个经典的递归问题,由三个柱子和一堆大小...
标题:汇编语言汉诺塔 描述:汇编语言实现汉诺塔,是先盘子编号从哪个柱子移动到哪个柱子。 知识点详解: ### 1. 汇编语言基础 汇编语言是一种低级编程语言,它与特定类型的计算机硬件结构紧密相连。在汇编语言...
汉诺塔是一个经典的递归问题,它源自印度的古老传说,涉及将一组圆盘从一根柱子移动到另一根柱子,遵循以下规则: 1. 每次只能移动一个圆盘。 2. 任何时候大盘子都不能位于小盘子之上。 在Java中实现汉诺塔的界面...
汉诺塔是一个经典的计算机科学问题,它源自印度的传说,要求将一堆盘子从一根柱子移动到另一根柱子,遵循以下规则:每次只能移动一个盘子,并且任何时候大盘子都不能位于小盘子之上。在C#中,解决汉诺塔问题通常采用...
汉诺塔游戏是一种经典的逻辑谜题,源自19世纪的法国,由数学家艾德蒙·洛卡特提出。这个游戏的目标是将一个柱子上的所有盘子,通过另外两个柱子作为辅助,按照大小顺序从底部移动到顶部。在移动过程中,任何时候都不...
汉诺塔(Hanoi Tower)是一款经典的逻辑游戏,它源于印度的一个传说,旨在通过移动盘子来演示一个看似简单但实则复杂的问题解决过程。在Flash AS 3.0环境中,我们可以利用ActionScript这一强大的脚本语言来创建交互...
汉诺塔(Hanoi Tower)是一个经典的数学游戏,通常用三根柱子和一堆不同大小的盘子来演示。在VRML(Virtual Reality Modeling Language,虚拟现实建模语言)中,我们可以利用其3D场景构建能力来模拟这个游戏。VRML是...
---汉诺塔源代码--- ---汉诺塔源代码--- ---汉诺塔源代码--- ---汉诺塔源代码--- ---汉诺塔源代码---
### 汉诺塔(Hanoi Tower)问题详解与C++实现 #### 一、汉诺塔问题背景介绍 汉诺塔(Tower of Hanoi),又称河内塔,是一个源自印度古老的数学游戏。该问题由法国数学家爱德华·卢卡斯于1883年发明,并以其富有...
算法分析设计中三柱汉诺塔算法的拓展,四柱汉诺塔的设计算法代码
汉诺塔是一个经典的递归问题,它源自一个古老的印度传说。在这个问题中,有三根柱子和一堆大小不一的圆盘,圆盘在最下面的柱子上按照从大到小的顺序堆叠。目标是将所有圆盘从第一根柱子移动到第三根柱子,过程中每次...