`
zj0713001
  • 浏览: 6898 次
  • 性别: Icon_minigender_1
  • 来自: 北京
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

zz:Ruby program 汉诺塔

 
阅读更多
汉诺塔(又称河内塔)问题是印度的一个古老的传说。

开天辟地的神勃拉玛在一个庙里留下了三根金刚石的棒,第一根上面套着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)
分享到:
评论

相关推荐

    分治与减治算法实验:题目3 汉诺塔问题的程序设计.docx

    ### 汉诺塔问题及其实现 #### 实验背景 汉诺塔(Tower of Hanoi)是一个经典的数学游戏,也是计算机科学中的一个经典问题。它最初由法国数学家Édouard Lucas在1883年发明。游戏的目标是将所有盘子从一个柱子移动...

    汉诺塔 源代码 -汉诺塔小程序

    ---汉诺塔源代码--- ---汉诺塔源代码--- ---汉诺塔源代码--- ---汉诺塔源代码--- ---汉诺塔源代码---

    汉诺塔非递归程序

    汉诺塔问题是一种经典的递归算法示例,但同样也可以通过非递归的方式进行实现。在给定的C++代码中,我们看到了一种不依赖于递归调用来解决汉诺塔问题的方法。以下是对该非递归程序的详细解析: ### 汉诺塔问题背景 ...

    java实现汉诺塔演示及手动操作汉诺塔

    汉诺塔是一个经典的递归问题,它源自一个古老的印度传说。在这个问题中,有三个柱子和一堆不同大小的圆盘,目标是将所有圆盘从一个柱子移动到另一个柱子,遵循以下规则: 1. 一次只能移动一个圆盘。 2. 不允许将大...

    实验二:prolog求解汉诺塔问题(人工智能实验报告)

    包含prolog求解汉诺塔问题的实验报告、源代码及试验运行截图

    不错的毕业设计、课程设计、练手c++语言项目:汉诺塔演示.rar

    不错的毕业设计、课程设计、练手c++语言项目:汉诺塔演示.rar 不错的毕业设计、课程设计、练手c++语言项目:汉诺塔演示.rar 不错的毕业设计、课程设计、练手c++语言项目:汉诺塔演示.rar 不错的毕业设计、课程设计、...

    用递归写的汉诺塔小程序

    汉诺塔游戏是一种经典的逻辑谜题,源自19世纪的印度,它巧妙地结合了数学和游戏,成为了教学递归思维的重要工具。本程序通过递归算法实现汉诺塔的解决方案,非常适合那些想要理解递归概念的人学习。 递归是编程中的...

    flash 3.0汉诺塔:小游戏

    汉诺塔(Hanoi Tower)是一款经典的逻辑游戏,它源于印度的一个传说,旨在通过移动盘子来演示一个看似简单但实则复杂的问题解决过程。在Flash AS 3.0环境中,我们可以利用ActionScript这一强大的脚本语言来创建交互...

    Scratch模拟游戏作品:汉诺塔模拟

    汉诺塔(Tower of Hanoi),又称河内塔,是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘。大梵天命令婆罗门把圆盘从下面开始按大小...

    Scratch高级创意编程 Scratch汉诺塔游戏实现 少儿图形化编程案例源程序

    Scratch汉诺塔创意编程源程序汉若塔:由4-8个不同积木块和3根柱子组成游戏规则:1、一次只能移一个积木(柱子最上面)2、积木只能在三个柱子上存放3、任何时刻不允许大的压小的案例完美的诠释了什么是汉诺塔游戏,...

    flash小游戏汉诺塔

    汉诺塔(Hanoi Tower)是一款经典的逻辑益智游戏,起源于19世纪末的法国,由数学家爱德华·卢卡斯提出。在这个游戏中,有三根柱子和一堆大小不一的圆盘,起初都堆在第一根柱子上,按照从大到小的顺序自下而上排列。...

    flash小游戏汉诺塔-Flash文档类资源

    汉诺塔(Hanoi Tower)是一款经典的逻辑游戏,源自19世纪由法国数学家艾德蒙·洛卡特(Edouard Lucas)提出的数学问题。它通常由三根圆柱和一堆不同大小的圆盘组成,玩家的目标是将所有圆盘从一根柱子移动到另一根...

    汉诺塔层次迭代算法和分析

    ### 汉诺塔问题迭代算法与分析 #### 引言 汉诺塔问题是一个经典的计算机科学问题,通常被用来教授递归的概念。长久以来,人们普遍认为递归是解决汉诺塔问题的最佳方法。然而,近年来研究者们发现迭代算法也可以...

    linux图形界面汉诺塔源程序(c,oop)

    datastruct.h :汉诺塔实体模拟-结构形式及可对塔进行的操作的接口&gt;; datastruct.c :汉诺塔结构与可进行的操作的实现方法&lt;由datastruct.h导出&gt;; 方案2:图形界面 graphics.h :汉诺塔实体模拟-结构形式及可对塔...

    C经典算法之双色汉诺塔

    ### C经典算法之双色汉诺塔 #### 双色汉诺塔算法解析 双色汉诺塔(Two-color Hanoi Tower)是基于传统汉诺塔游戏的一种变体。传统汉诺塔游戏由三个柱子及不同大小的圆盘组成,玩家的目标是将所有圆盘从初始柱子...

    简单的汉诺塔html网页游戏

    汉诺塔游戏是一种基于递归算法的经典逻辑游戏,源自印度古老传说,由法国数学家爱德华·卢卡斯在19世纪末正式提出。在这个简单的汉诺塔HTML网页游戏中,玩家将体验到如何通过一系列合法移动将全部圆盘从一根柱子...

    人工智能prolog语言实验:梵塔(汉诺塔)问题

    已知3个柱子1,2,3和3个盘子A,B,C(A比B小,B比C小)。初始状态下,A,B,C依次放到1柱上。目标状态是A,B,C依次放在柱子2上。条件是每次可移动一个盘子,盘子上方是空顶方可移动,而任何时候都不允许大盘放在...

    汉诺塔问题的拓展 四柱汉诺塔

    算法分析设计中三柱汉诺塔算法的拓展,四柱汉诺塔的设计算法代码

    自己用java做的汉诺塔

    汉诺塔是一个经典的递归问题,它源自于印度的一个古老传说。在Java编程中实现汉诺塔游戏,我们可以深入理解递归算法、面向对象编程以及事件处理等方面的知识。以下是对这个项目的详细分析: 1. **递归算法**: ...

Global site tag (gtag.js) - Google Analytics