引用
汉诺塔:汉诺塔(又称河内塔)问题是源于印度一个古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上安大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小顺序重新摆放在另一根柱子上。并且规定,在小圆盘上不能放大圆盘,在三根柱子之间一次只能移动一个圆盘。
传说
在印度,有这么一个古老的传说:在世界中心贝拿勒斯(在印度北部)的圣庙里,一块黄铜板上插着三根宝石针。印度教的主神梵天在创造世界的时候,在其中一根针上从下到上地穿好了由大到小的64片金片,这就是所谓的汉诺塔。不论白天黑夜,总有一个僧侣在按照下面的法则移动这些金片:一次只移动一片,不管在哪根针上,小片必须在大片上面。僧侣们预言,当所有的金片都从梵天穿好的那根针上移到另外一根针上时,世界就将在一声霹雳中消灭,而梵塔、庙宇和众生也都将同归于尽。
不管这个传说的可信度有多大,如果考虑一下把64片金片,由一根针上移到另一根针上,并且始终保持上小下大的顺序。这需要多少次移动呢?这里需要递归的方法。假设有n片,移动次数是f(n).显然f(1)=1,f(2)=3,f(3)=7,且f(k+1)=2*f(k)+1。此后不难证明f(n)=2^n-1。n=64时,
f(64)= 2^64-1=18446744073709551615
假如每秒钟一次,共需多长时间呢?一个平年365天有 31536000 秒,闰年366天有31622400秒,平均每年31556952秒,计算一下,
18446744073709551615/31556952=584554049253.855年
这表明移完这些金片需要5845亿年以上,而地球存在至今不过45亿年,太阳系的预期寿命据说也就是数百亿年。真的过了5845亿年,不说太阳系和银河系,至少地球上的一切生命,连同梵塔、庙宇等,都早已经灰飞烟灭。
public class Hanoi {/**
*
* @param n
* 盘子的数目
* @param origin
* 源座
* @param assist
* 辅助座
* @param destination
* 目的座
*/
public void hanoi(int n,char origin,char assist,char destination) {
if (n == 1) {
move(origin,destination);
} else {
hanoi(n - 1,origin,destination,assist);
move(origin,destination);
hanoi(n - 1,assist,origin,destination);
}
}
// Print the route of the movement
private void move(char origin,char destination) {
System.out.println("Direction:" + origin + "--->" + destination);
}
public static void main(String[] args) {
Hanoi hanoi = new Hanoi();
hanoi.hanoi(3,'A','B','C');
}
}
分享到:
相关推荐
通过这种方法,我们不仅可以理解如何用非递归方式解决汉诺塔问题,还能深入学习栈数据结构的应用,以及如何利用C#编程语言实现这种算法。在实际编码中,可以参考提供的"汉诺塔最终版"文件,分析其代码逻辑,进一步...
用C++实现汉诺塔的递归算法,定义了类和方法。
汉诺塔问题是一个经典的计算机科学问题,通常使用递归算法来解决。然而,这个实验报告提出了使用非递归算法来解决汉诺塔问题的方法。非递归算法的关键在于找到一个可重复执行的步骤序列,而不是像递归那样通过自我...
在实际编程实现"汉诺塔非递归算法"时,可以使用如Python这样的高级语言,通过定义栈类并编写相应的移动函数来完成任务。代码会包括初始化栈、处理边界条件、进行盘子移动等逻辑。文件"HanoiNRecursion"可能包含了...
用C语言实现汉诺塔的递归算法,另外还有用栈来实现的方式:http://download.csdn.net/detail/jason19905/6419427
汉诺塔问题的递归算法,附详细代码以及运行结果,有详细的算法描述。
总之,非递归的汉诺塔问题C++实现是一种创新的解决方案,它利用数据结构来避免递归调用的开销,展示了算法设计的灵活性和创造性。通过学习这种实现,你可以更深入地理解数据结构、算法以及它们在实际编程中的应用。
递归算法通常是解决汉诺塔问题的常见方法,但这里我们要讨论的是非递归算法。 非递归算法通常基于迭代或堆栈的思想来实现。在武汉大学的算法描述中,可能会使用一种称为"栈模拟"的方法,这种方法可以有效地避免递归...
C#汉诺塔(递归调用)
用栈来实现汉诺塔,要明白递归就是栈的重要应用之一,递归是系统自动调用栈来处理。
适应于大学生学习算法
总的来说,这个非递归实现使用了状态跟踪和循环控制,避免了递归调用带来的额外开销,适合于理解和学习汉诺塔问题的另一种解决思路。这种方法虽然在代码复杂性上可能略高于递归解法,但在执行效率上可能会有优势,...
汉诺塔游戏是一种经典的逻辑问题,它通过递归算法来解决。在这个游戏中,有三个柱子,分别标记为A、B、C,A柱上从下到上按大小顺序叠放着n个圆盘。目标是将所有圆盘从柱子A移动到柱子C,但每次只能移动一个圆盘,...
汉诺塔问题展示了递归和迭代两种不同的编程思维方式。递归算法简洁明了,易于理解,但可能造成较高的栈空间使用;非递归算法虽然实现复杂,但效率更高。在实际应用中,选择哪种方法取决于具体的需求,如时间效率、...
汉诺塔问题是一个经典的递归算法问题,它涉及到三个柱子(塔)和若干个大小不一的圆盘。在初始状态下,所有圆盘按照大小顺序堆叠在第一个柱子(1号塔)上,大的在下,小的在上。目标是将所有的圆盘从1号塔移动到2号...
通过深入理解并实践非递归汉诺塔算法,开发者不仅能提高编程技巧,还能增强对算法设计和优化的理解。 ### 结论 非递归汉诺塔程序通过巧妙的设计,展示了如何在不使用递归的情况下解决复杂问题,这不仅是一次对经典...
用于学习帮助,汉诺塔非递归演算程序代码 使用C语言编写的。供大家学习参考,希望能派上用场。
汉诺塔的非递归解法,十分神奇,值得借鉴! 汉诺塔的非递归解法,十分神奇,值得借鉴! 汉诺塔的非递归解法,十分神奇,值得借鉴! 汉诺塔的非递归解法,十分神奇,值得借鉴! 汉诺塔的非递归解法,十分神奇,值得...
在VB 2005中实现汉诺塔的递归程序,我们可以深入理解递归算法及其在实际编程中的应用。 首先,我们要了解递归的基本概念。递归是函数或过程在执行过程中调用自身的一种方法。在汉诺塔问题中,递归非常自然地出现,...
本文将详细讲解如何用C#实现汉诺塔问题以及递归的概念。 首先,理解递归是非常关键的。递归是一种算法或函数调用自身的方法,通常用于解决可以分解为相同子问题的问题。在汉诺塔问题中,我们可以通过递归策略来解决...