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

第二节 关键性结论

通过反复实践与观察,我们发现了解决汉诺塔问题的思路。无论圆盘的数量有多少,我们都可以把它们当作2个盘子来处理。假设共有N个圆盘,我们把它们想象为两个圆盘,其中一个圆盘是整个塔的塔底——最大的那个盘子,如图6所示,左边那个绿色的盘子就是塔底;另一个圆盘是其余所有的盘子,即,N-1个盘子。这里我们需要发挥一点想象力,即,把一组连续排列的盘子想象为一个盘子。这样一来,多个盘子的问题就转化为2个盘子的问题。用同样的思路来分解这N-1个盘子,这样持续的分解下去,多圆盘的问题最终转化为2个圆盘的问题。

图6 将塔底以外的所有圆盘想象成一个盘子

在上一节中,我们在解决3个盘子的问题时,顺便解决了2个盘子的问题,我们可以回顾一下。在图5中,第1~3步完成了两个盘子的移动——上面的2个小盘子从S移动到B,同样,第5~7步又将两个小盘子从B移动到了T。

两个盘子的解法非常简单,只需3步:

  1. 小盘子从“出发点”移动到“缓冲区”;

  2. 大盘子从“出发点”移动到“落脚点”;

  3. 小盘子再从“缓冲区”移动到“落脚点”。

注意上面的出发点、缓冲区及落脚点都加标了引号,为了表明它们是相对的,以区别于绝对的起点S、绝对的缓冲区B以及绝对的终点T。为了区分两个含义不同的缓冲区,我们称带引号的缓冲区为相对缓冲区。针对图5中的第1~3步而言,出发点为S,相对缓冲区为T,落脚点为B;而对于第5~7步来说,出发点是B,相对缓冲区为S,落脚点为T。

我们引入两套不同的名称(起点、缓冲区、终点与出发点、相对缓冲区、落脚点),是为了在移动盘子的过程中,清晰地表达盘子的运动路径,这些概念将有助于我们将物理问题转化为程序问题。

以图6中的8个盘子为例,我们用逆向推演的方法找到问题的解,即,从最后一步开始,推演到起始的第一步。如图7所示,要想将图6中假想的两个盘子移动到终点T,那么下一步必须将起点S处的绿盘子移动到终点T,然后再将假想的盘子(N-1=7个)从缓冲区B移动到终点T。在后续的说明中,我们将直接使用S、B、T替代“起点S”、“缓冲区B”及“终点T”。

图7 将多圆盘问题转化为两个圆盘问题

为了将中间的7个盘子移动到T,把B上的7个盘子分解为两组,上面的6个盘子为一组,将它们移动至S,塔底的第7个盘子为另一组,移动至T。如图8所示。

图8 继续将多圆盘问题转化为双圆盘问题

下一步该做什么呢?我猜你已经迫不及待地想上手操作了。是的,将S上的6个盘子分为两组,上面5个盘子为一组,从S移动到B,塔底的棕色盘子为另一组,从S移动到T,移动结果如图9所示。

图9 逆向推演盘子的移动过程

接下来的操作我想你已经清楚了,将剩余的5个盘子再分为两组,以此类推,直到所有盘子都移动到T,如图10所示,其中的图③是真正的两个盘子,此时无需再借用想象力,直接将塔尖的小盘子移动到B,将塔底的大盘子移动到T,最后再将小盘子从B移动到T,任务结束。

图10 将全部盘子移动到终点T

在上述过程中,我们一直在运用两个盘子的移动策略:

(1)小盘子从出发点移动至相对缓冲区;

(2)大盘子从出发点移动至落脚点;

(3)小盘子再从相对缓冲区移动到落脚点。

上述推演并没有解决移动N个盘子的问题,但是它将N个盘子的问题转化为N-1个盘子的问题,继而又将N-1个盘子的问题转化为N-2个盘子的问题,直到最后转化为2个盘子的问题。显然,我们已经有了移动两个盘子的办法,因此,剩下的问题是,如何从N走到2,这需要借助于程序来说明。

== 未完待续 ==

(0)

相关推荐

  • 落脚点

    宠爱的出发点是爱,落脚点却是恨: 嫉妒的出发点是进,落脚点却是退: 梦幻的出发点是炫,落脚点却是空: 贪婪的出发点是盈,落脚点却是亏.

  • 不要让爱变成了恨

    即使不爱了也不要互相伤害,不爱是两个人的事,但互相伤害就是两家人的事.不要因为不爱,就变成了恨,相爱是两个人的幸福.宠爱的出发点是爱,落脚点却是恨:嫉妒的出发点是进,落脚点却是退:梦幻的出发点是绚(烂 ...

  • 出发点与落脚点

    宠爱的出发点是爱,落脚点却是恨: 嫉妒的出发点是进,落脚点却是退: 梦幻的出发点是绚,落脚点却是空: 贪婪的出发点是盈,落脚点却是亏.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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