汉诺塔(又称河内塔)问题是印度的一个古老的传说。
开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着64个圆的金片,最大的一个在底下,其余一个比一个小,依次叠上去,庙里的众僧不倦地把它们一个个地从这根棒搬到另一根棒上,规定可利用中间的一根棒作为帮助,但每次只能搬一个,而且大的不能放在小的上面。当所有金片都按照规则移到另一个棒上之时就是世界毁灭之时。
已经证明当金片数量为 n 时,需要搬运 2 的 n 次方 - 1 次。所以上述64个金片按照规则需要移动18446744073709551615次才行。假设和尚们一秒钟能搬动一次金片,昼夜不息,轮班操作,至少需要搬运五千八百四十九亿年以上。而地球到目前为止也仅仅存活了46亿年,所以地球末日应该还早 …… ^ - ^
现在我们把汉诺塔当成一个游戏,比如给你 n 个金片,三根金刚石棒分别为A,B,C,初始金片都在A上,最终要求都转移到C上,你会怎么搬运?
递归解法
$step = ['A', 'B', 'C']
def hano1(n, from, to)
if n == 1
# puts from + "->" + to
return
end
rest = ($step - [to, from])[0]
hano1(n - 1, from, rest)
hano1(1, from, to)
hano1(n - 1, rest, to)
end
hano1(4, 'A', 'C')
非递归解法
def move(from, to)
p $step[from] + "->" + $step[to]
$hn[to].unshift($hn[from].shift)
p $hn
end
def hano2(n)
$hn = [(1..n).to_a, [], []]
if n % 2 == 0
$step = ['A', 'B', 'C']
last_pos = 2
else
$step = ['A', 'C', 'B']
last_pos = 1
end
pos_1 = 0
until $hn[last_pos].size == n
new_pos_1 = pos_1 + 1
new_pos_1 = 0 if new_pos_1 == 3
move(pos_1, new_pos_1)
pos_1 = new_pos_1
break if $hn[last_pos].size == n
pos_2 = ([0, 1, 2] - [pos_1])[0]
pos_3 = ([0, 1, 2] - [pos_1])[1]
if $hn[pos_2].size == 0
move(pos_3, pos_2)
elsif $hn[pos_3].size == 0
move(pos_2, pos_3)
elsif $hn[pos_2][0] < $hn[pos_3][0]
move(pos_2, pos_3)
else
move(pos_3, pos_2)
end
end
end
hano2(4)
分享到:
相关推荐
### 汉诺塔问题及其实现 #### 实验背景 汉诺塔(Tower of Hanoi)是一个经典的数学游戏,也是计算机科学中的一个经典问题。它最初由法国数学家Édouard Lucas在1883年发明。游戏的目标是将所有盘子从一个柱子移动...
---汉诺塔源代码--- ---汉诺塔源代码--- ---汉诺塔源代码--- ---汉诺塔源代码--- ---汉诺塔源代码---
汉诺塔问题是一种经典的递归算法示例,但同样也可以通过非递归的方式进行实现。在给定的C++代码中,我们看到了一种不依赖于递归调用来解决汉诺塔问题的方法。以下是对该非递归程序的详细解析: ### 汉诺塔问题背景 ...
汉诺塔是一个经典的递归问题,它源自一个古老的印度传说。在这个问题中,有三个柱子和一堆不同大小的圆盘,目标是将所有圆盘从一个柱子移动到另一个柱子,遵循以下规则: 1. 一次只能移动一个圆盘。 2. 不允许将大...
包含prolog求解汉诺塔问题的实验报告、源代码及试验运行截图
不错的毕业设计、课程设计、练手c++语言项目:汉诺塔演示.rar 不错的毕业设计、课程设计、练手c++语言项目:汉诺塔演示.rar 不错的毕业设计、课程设计、练手c++语言项目:汉诺塔演示.rar 不错的毕业设计、课程设计、...
汉诺塔游戏是一种经典的逻辑谜题,源自19世纪的印度,它巧妙地结合了数学和游戏,成为了教学递归思维的重要工具。本程序通过递归算法实现汉诺塔的解决方案,非常适合那些想要理解递归概念的人学习。 递归是编程中的...
汉诺塔(Hanoi Tower)是一款经典的逻辑游戏,它源于印度的一个传说,旨在通过移动盘子来演示一个看似简单但实则复杂的问题解决过程。在Flash AS 3.0环境中,我们可以利用ActionScript这一强大的脚本语言来创建交互...
汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小...
Scratch汉诺塔创意编程源程序汉若塔:由4-8个不同积木块和3根柱子组成游戏规则:1、一次只能移一个积木(柱子最上面)2、积木只能在三个柱子上存放3、任何时刻不允许大的压小的案例完美的诠释了什么是汉诺塔游戏,...
汉诺塔(Hanoi Tower)是一款经典的逻辑益智游戏,起源于19世纪末的法国,由数学家爱德华·卢卡斯提出。在这个游戏中,有三根柱子和一堆大小不一的圆盘,起初都堆在第一根柱子上,按照从大到小的顺序自下而上排列。...
汉诺塔(Hanoi Tower)是一款经典的逻辑游戏,源自19世纪由法国数学家艾德蒙·洛卡特(Edouard Lucas)提出的数学问题。它通常由三根圆柱和一堆不同大小的圆盘组成,玩家的目标是将所有圆盘从一根柱子移动到另一根...
### 汉诺塔问题迭代算法与分析 #### 引言 汉诺塔问题是一个经典的计算机科学问题,通常被用来教授递归的概念。长久以来,人们普遍认为递归是解决汉诺塔问题的最佳方法。然而,近年来研究者们发现迭代算法也可以...
datastruct.h :汉诺塔实体模拟-结构形式及可对塔进行的操作的接口>; datastruct.c :汉诺塔结构与可进行的操作的实现方法<由datastruct.h导出>; 方案2:图形界面 graphics.h :汉诺塔实体模拟-结构形式及可对塔...
### C经典算法之双色汉诺塔 #### 双色汉诺塔算法解析 双色汉诺塔(Two-color Hanoi Tower)是基于传统汉诺塔游戏的一种变体。传统汉诺塔游戏由三个柱子及不同大小的圆盘组成,玩家的目标是将所有圆盘从初始柱子...
汉诺塔游戏是一种基于递归算法的经典逻辑游戏,源自印度古老传说,由法国数学家爱德华·卢卡斯在19世纪末正式提出。在这个简单的汉诺塔HTML网页游戏中,玩家将体验到如何通过一系列合法移动将全部圆盘从一根柱子...
已知3个柱子1,2,3和3个盘子A,B,C(A比B小,B比C小)。初始状态下,A,B,C依次放到1柱上。目标状态是A,B,C依次放在柱子2上。条件是每次可移动一个盘子,盘子上方是空顶方可移动,而任何时候都不允许大盘放在...
算法分析设计中三柱汉诺塔算法的拓展,四柱汉诺塔的设计算法代码
汉诺塔是一个经典的递归问题,它源自于印度的一个古老传说。在Java编程中实现汉诺塔游戏,我们可以深入理解递归算法、面向对象编程以及事件处理等方面的知识。以下是对这个项目的详细分析: 1. **递归算法**: ...