汉诺塔问题的两种解法(1)

汉诺塔是一种益智玩具,源自古老的印度。如图1、图2及图3所示,有三根柱子,若干个大小不等的圆盘按顺序依次叠落在起点(左侧)的柱子上,通过多次移动后,全部圆盘要叠落在终点(右侧)的柱子上。移动必需遵守两个原则:

  1. 每次只能移动一个圆盘;

  2. 移动过程中,大圆盘不允许覆盖在小圆盘上。

图1 游戏的初始状态

图2 游戏的中间状态

图3 游戏的结束状态

第一次接触这个游戏,是在一本叫做《具体数学》的书里(图4),第一章讨论的就是这个问题。不得不说《具体数学》是一本非常有趣的书,教你如何将物理世界的问题转化为数学问题(进而才有可能转化为计算机可解的问题),不过阅读它需要一颗闲适的心,以及非常专注的状态。上次读这本书大约是在一年前。

图4 一本与算法有关的数学书

Roadlabs给陶陶同学出了一些练习算法的题,茶余饭后提起了汉诺塔,我想起了这本书,但关于书中陈述的内容已经淡忘了。经不起诱惑的我,放下手头的翻译工作,参与到他们的练习中。为了葆有求解过程中探索与思考的快乐,我们约定好,每个人独立思考,不查资料寻求思路,必要时可以在一起讨论。我们的项目正式开始了。

第一节 解决物理世界中的问题

面对这样一个物理世界中的问题,首先必须在物理世界中找出问题的解,才有可能在这个解的基础上,寻求数学乃至程序的解法。

先从简单的3个圆盘开始,如图5所示,完成任务共需要7个步骤。

图5 三个圆盘的移动方法

此时,建议读者自己在纸上画一画,试试看4个、5个圆盘如何移动,需要多少步骤,是否可以从中发现一些规律。经过反复实践,你会发现如下规律:

  1. 移动4个圆盘需要15步,移动5个圆盘需要31步;

  2. 移动3个、5个圆盘时,第一步为S→T(从起点移动到终点),移动4个圆盘时,第一步为S→B(从起点移动到缓冲区);

  3. 移动3个、5个圆盘时,最后一步为S→T(从起点移动到终点),移动4个圆盘时,最后一步为B→T(从缓冲区移动到终点)。

关于移动步数,3个盘子7步,4个盘子15步,5个盘子31步,有兴趣的读者通过观察思考,或许会发现其中的规律,如果再结合1个、2个盘子的移动步数,相信你会有所发现。

关于不同数量盘子移动时的第一步与最后一步,不难猜想,它们与盘子数量的奇偶有关,当盘子数为奇数时,第一步要移动到终点,而当盘子数为偶数时,第一步要移动到缓冲区,最后一步也有类似的规律。

经过反复移动不同数量的盘子,你也许会发现更多的规律,并找到在物理世界里解决这一问题的通用办法。这里暂时不揭晓答案,留一些时间让读者思考,切记,不要到网上搜索答案,否则,失去的将是探索与发现的快乐!

==未完待续==

(0)

相关推荐

  • 汉诺塔问题,五个盘子具体走法

    我移了三盘的和四盘的,就是推不出五盘的...笨嘛...等指教 1个回答 满意答案 fatso1118 推荐于 2017.12.15 五个柱子!分别为1号 2号 3号 五个盘子 A B C D E 这样 ...

  • 关于C语言汉诺塔问题,当程序执行到001、002、003步时,不知道具体是个什么步骤,求大神解惑!

    关于C语言汉诺塔问题,当程序执行到001.002.003步时,不知道具体是个什么步骤,求大神解惑! 狼首破vtb8452016.06.12浏览17次其他分享举报 #include<stdio.h ...

  • Py:递归求解汉诺塔,简单的几行编程可以搞定很高层的三柱汉诺塔游戏

    Py:递归求解汉诺塔,简单的几行编程可以搞定很高层的三柱汉诺塔游戏 输出结果 核心代码 def hanoi(n,x,y,z): if n==1: print(x,'--→',z) else: hano ...

  • 你会玩汉诺塔吗?——让递归算法来帮你,只需“3步”

    今天我们来介绍一种很常见的算法--递归. 递归函数 什么是递归?简单的说,递归就是通过不断调用自己,来完成不断循环的一个过程. 可能概念有些拗口,我们编写一个递归函数来说明.斐波那契数列大家都知道,它 ...

  • 汉诺塔算法

    汉诺塔算法 ----C++语言递归实现 线上幽灵 2018-04-24 17:19:59 8159 收藏 26分类专栏:算法 文章标签:汉诺塔版权声明:本文为博主原创文章,遵循 CC 4.0 BY-S ...

  • 如何玩八层的汉诺塔?

    8层汉诺塔共有: 2^8 - 1 = 255个步骤 以下是移动的过程:(说明: A表示第一个柱子   B表示第二个珠子  C表示第三个柱子  -->表示盘的移动方向) 对于汉诺塔问题的求解,可以 ...

  • 汉诺塔问题的两种解法(2)

    第二节 关键性结论 通过反复实践与观察,我们发现了解决汉诺塔问题的思路.无论圆盘的数量有多少,我们都可以把它们当作2个盘子来处理.假设共有N个圆盘,我们把它们想象为两个圆盘,其中一个圆盘是整个塔的塔底 ...

  • 汉诺塔问题的两种解法(3)

    第三节 汉诺塔的递归解法--移动两个盘子 一.用户界面 在App Inventor中创建一个项目,命名为汉诺塔,用户界面在手机中的样子如图11所示,在AppInventor设计视图中,为项目添加组件, ...

  • 汉诺塔问题的两种解法(4)

    第四节 汉诺塔问题的递归解法--移动所有盘子 上一节我们实现了连续移动两个盘子(数字),现在我们发挥一点儿想象力,将上一节的两个盘子当作一个盘子来处理,从而得出移动3个盘子的过程,代码如图22所示. ...

  • 汉诺塔问题的两种解法(5)

    第五节 条件限定法--限定条件 限定条件法不关注移动过程的整体规律,而着眼于具体的移动路径(规定每一步移动的出发点及落脚点),对每一种可能的移动路径设置限定条件,通过对限制条件的设置及调整,逐渐找到最 ...

  • 汉诺塔问题的两种解法(6)

    第六节 条件限定法--变量与过程 在开始编写程序之前,首先将此前已经完成的项目另存为"汉诺塔2",并在汉诺塔2的基础上,编写新的程序.原有项目中需要保留的全局变量及过程如图30所示 ...

  • 汉诺塔问题的两种解法(7)

    第七节 条件限定法--演示移动过程 上一节完善了2个已有过程,并新增了6个有返回值的过程,完成了对出发点.落脚点的选择,有了这些结果,本节可以收获成果了. 一.两个无返回值过程 (1)不连续移动 出发 ...

  • 汉诺塔问题的两种解法(8)

    第八节 求解过程小结 我们已经完成了对数字(盘子)的移动,并成功地演示了数字的移动过程.阅读并理解前面几节中的程序并不难,就这个例子而言,难的不是程序,而是编写程序之前对移动规律的归纳与整理,这也正是 ...

  • 科目余额表,只取最明细一级数据?Power Query和Power Pivot两种解法!

    小勤:下面这个表里是从财务系统里导出来的科目表,怎么能只保留本币里的最底层明细数据?最终本币列结果如右侧所示: 大海:能通过判断下一行中的科目编码是否包含本行科目编码来判断当前行是否为非明细行吗? 小 ...

  • 分享一道圆,两种解法,一种倍长中线余弦定...

    分享一道圆,两种解法,一种倍长中线余弦定...