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

第五节 条件限定法——限定条件

限定条件法不关注移动过程的整体规律,而着眼于具体的移动路径(规定每一步移动的出发点及落脚点),对每一种可能的移动路径设置限定条件,通过对限制条件的设置及调整,逐渐找到最优的完整的移动路径。如果说递归方法依赖于人类的智能,那么限定条件法则依赖于时下流行的机器的“智能”。

在由Roadlabs、陶陶和我组成的三人项目组中,Roadlabs负责给出限定条件,陶陶和我负责用具体的编程语言来实现。在Roadlab给出的若干个限定条件中,经过反复筛选验证,最终确定以下四个限定条件。

(1)取胜条件:当左、中为空,右不为空时,赢得游戏;

(2)单一原则:每次只能移动一个数字;

(3)大小原则:小的数字必须置于大的数字之上;

(4)不连续移动原则:不允许连续移动一个数字;

上述的4个条件中,条件1、条件2及条件3是依游戏规则而定,条件2是人为增加的限定,为了防止不必要的重复移动,或者出现死循环。

这些条件看起来都很简单,但是要将它们转化为程序语言,还需要进一步的演绎推理,转化成可操作的步骤。上述条件还可以进一步演化出以如4个结论。

(a)每次移动中,可用的出发点是唯一的(此条结论由陶陶同学给出);

(b)针对(a)中所指的唯一出发点,当塔尖(列表首项——即将被移动的数字)不为1时,可用的落脚点是唯一的;

(c)当塔尖为1时,塔尖(数字1)的落脚点不唯一,但是作为整体的“塔”的落脚点是唯一的(关于塔的定义见结论d),它必须落在首项值比塔底大1的那一列上。如果塔高(数字的个数)为奇数,则1的落脚点=塔的落脚点;如果塔高是偶数,则1的落脚点=相对缓冲区(塔落脚点以外的另一个可落脚的点);

(d)塔的定义:从1开始的、差值连续为1的数字,其中1被称为塔尖,最后一个数(最大的数)被称为塔底。

上述结论是否能够证明它们的正确性呢?这里我们对结论a给出证明,其余几项希望读者自行论证。

证明:每一次移动的出发点都是唯一的。

●当步数=0时,出发点只能是左侧的列,即起点,因此是唯一的;

●当步数>0时:

○ 如果最后移动项=1,那么出发点一定不是1(不连续移动原则),因此,下一个出发点必然是非1的两项中值较小的一列,因此出发点是唯一的;

○ 如果最后移动项≠1,那么下一个出发点一定是数字1所在的列,因为上一次移动的出发点所在的列,其首项的当前值一定大于最后移动项的值,因此该首项无处可移(大小原则)。

根据以上分析,可以证明结论a是正确的——每一次移动的出发点都是唯一的。有兴趣的读者不妨仿照此方法,对结论b、c给出证明,图29可供参考。结论d是对“塔”的定义,无须证明。

图29 猜猜看图中最后一次移动的是哪个盘子

有了上述结论,就可以着手用程序来实现它们了。

== 未完待续 ==

(0)

相关推荐

  • 落脚点

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

  • 出发点与落脚点

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

  • 不要让爱变成了恨

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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