APP下载

从规则的实体化看计算思维

2021-12-17陈凯

中国信息技术教育 2021年17期
关键词:棋子画图实体

陈凯

有一种数列叫做三角形数列,数列由三角形数组成,它们是1、3、6、10、15、21、28……关于三角形数之名的来历,看图1便可知晓。很显然,第n项三角形数即是前n项自然数之和。对于大部分人来说,通过在头脑中想象一个三角形点阵的构建过程来计算前n项自然数之和,还是比较容易的。那么,如何让某个自动装置也能够计算出第n项三角形数,或者说计算出前n项自然数的数列和?上一期本栏目的《从数据的空间结构看计算思维——以数列求和为例》这篇文章中提到,为了培养计算思维,需要让学生体验到,在自动计算的任务实现的过程中,既要考虑人的需求,同时也要从机器运作的可能性、可行性和效率方面来考虑构建一个自动计算模型的问题。为了达成此目标,方法可能有多种,本文设计方案将体验过程展开为两步:第一步是针对计算任务的目标创设出一种自动变换规则,然后将变换过程实体化;第二步是将变换规则本身也实体化。

● 第一步:创设自动变换规则,并将变换过程实体化

如果要设计一个生成三角形数的装置,那么它的基本结构如图2所示。

应该如何设定变换规则?传统的数学方法很简单,如从1、2、3开始累加,直到判断加到n时停止;又如为求得n项三角形数,则先递归求n-1项三角形数;再如直接应用n(n+1)/2的通項公式。但对于一个简单的自动变换装置来说,这些方法中的数字符号本身的变换和处理是非常困难的,为了更容易将变换过程实体化,可以暂时先避免使用数字符号,而用某种实体的数量来代表某个数。

例如,在画图软件里玩图形变换,即便是简单的画图软件,也可以是培养计算思维的好工具,张勤坚老师在《教学设计:画图里的计算思维》一文中提到,通过复制、翻转和拼接,就可以实施有思维含量的实践操作,笔者深以为然。如何设定画图规则用以实现三角形数的计算呢?能简单想到的方法如:第一行画n个点,第二行画n-1个点,第三行画n-2个点……每新加一层就少画一个点,等到不再有点可画时,则数一下所有点的数量。这样,就将第n项三角形数的生成过程同构为图形变换的过程。这里给出一个有趣的谜题,如何在画图软件中,在不观看屏幕的情况下,只用键盘操作来实现n,n-1,n-2……个点累加的效果,也就是说,通过某种机械化重复键盘操作动作的方式,实现如下页图3所示的图形变换。

虽然说图形变换操作是在画图软件中进行的,但换成实物来代替那些点,效果是类似的(如摞瓶子)。然而,这些规则还是需要依靠人来执行的,大家不妨先行思考一下,如何设定规则,让一个简单的装置自动实现图形变换操作?

这里再举一个用类似于用跳棋游戏的方法实现三角形数计算的例子,假设要计算的是第4项三角形数,则可以在初始时放置一排4个“*”号棋。从最左面的棋子开始,“*”号棋可以用它右面的棋子当跳板跳到整排棋子的末尾,如果它右面的棋子也是“*”号棋,则当它跳跃到末尾时变为“#”号棋,如果它右面是“#”号棋,则它跳跃到末尾时自动消失。当这一排棋子最左面是“#”号棋时,它的跳跃规则和“*”号棋类似,它可以用右面的棋子当跳板跳到末尾,如果它右面的棋子也是“#”号棋,则当它跳跃到末尾时变为“*”号棋,如果它右面是“*”号棋,则它跳跃到末尾时自动消失。棋子具体跳跃的过程演示如图4所示,演示中用点来代表跳跃后空出的位置:

当无法再找到可跳跃的棋子时,最后一个棋子处在第10个字符的位置,这就对应了第4项的三角形数是10。

用这两种形状的跳棋,按预设规则跳跃和落子,就可以计算出第n项三角形数。不过,与刚才的分层画点的方法同样存的问题是:棋子跳跃和落子的规则是由人的头脑来监督的,能否制作出一个装置,让这个跳棋装置按规则自动运行起来?

● 第二步:将变换规则也实体化

为了制作出一个自动实现变换的装置,不仅要考虑变换对象和过程的实体化,还要考虑变换规则本身的实体化。

对于分层画点的方案,存在这样的问题:怎样自动实现后一层画的点比前一层画的点恰好少一个?下面给出一种思路:设计出一种拼插板,每个拼插板均是数字1,规定必须将拼插板左右两端同时插入拼插槽内,可以想象最上面一排拼插板是悬挂在空中的,新一层的拼插板如果只有一端插入拼插槽,仍然会因为重力作用掉落。按此规则拼接就能解决刚才的问题(如图5)。例如,为了计算第3项三角形数,可以排列好三个拼插板,然后陆续将其他拼插板插入拼插槽内,最后拼接过程会自动停止(想象一下,虽然用于执行自动拼接任务的装置始终在运转,但拼接的图案却不会再发生变化),用到的拼插板的数量就是第3项三角形数6。

这样,就在一定程度上将头脑中的拼图规则实体化了,可以让学习者认识到,非实体化的规则是依赖于语言的,是靠人脑的规定而使得图形产生变化,就好像下棋的双方都必须遵守该种棋的规则那样。而实体化的规则依赖于某种具体的结构,图形的变换方式是在结构上被限定的。关于实体化,计算机科学中考虑的重点与通用技术学科中考虑的重点不同,在通用技术学科中,是考虑如何将设计图样转换为实体,在计算机科学中,是考虑如何用实体的变换来同构状态的变换过程。但这个方法的实体化还很不彻底,“必须将拼插板左右两端同时插入拼插槽内”这一步还是需要人来实施。对比上面的拼插板,一个更传统的实体化的规则转换系统可能是这样实现的:首先,用一个树状结构来对应先前的拼图,树的节点处是可以存储状态的,在第一行,按希望计算的项数连续画点,在后续行中,只有当左前方并且右前方的节点的状态是点时,前节点的状态才是点,否则就是空,如上页图6所示。这个变换规则比先前的“每新加一层就少画一个点”更明确,它解释了“少画一个点”在结构上到底是如何做到的。

接下来的任务,是将“只有当左前方并且右前方是点时,则当前格子里才是点”这一规则进一步还原为更实体的形式,那就是逻辑门之间的连接结构,图7所示是一个可用于计算第n项三角形数的数字逻辑原理图,它仿佛是横过来摆放的树,其基本原理是依靠用与门获得邻近两个存储单元的数据并实现逻辑运算的工作,这个可以互动的原理图是在DigitalJS在线软件中借助Verilog语言制作的,图示展现的是计算第3项三角形数为6的情况。这个装置实现了规则的“相对”实体化。为什么说“相对”呢?所谓的实体常常是相对于某个更实体的衬底而显现出来的,而这个更实体的衬底,本身很可能也只是相对于其他衬底而相对显现为实体,通常来说,只有最底层的电路和机械装置才能算是绝对的物质实体。关于实体和衬底的关系,大家可以参考侯世达的《哥德尔艾舍尔巴赫:集异璧之大成》一书,限于篇幅这里不再展开。如果要将数字逻辑结构的层次进一步还原为更实体的装置,就要将逻辑门展开为场效应管或晶体管电路了。

看完分层画点的例子,再来看跳棋的例子,显然,跳棋规则的实体化看上去更加困难,因为棋子不仅要跳过若干个未知数量的其他棋子,还要根据当作跳板的棋子的状态来决定自己跳跃后落子时的状态。这看上去很难仿照分层画点的例子直接用逻辑原理图来完成。所以需要引入一个相对实体化的中间装置,来实现棋子的跳动。这里给出一种方案:设定某个检测、匹配和替换装置,它可以将检测到的以某种模式邻近的两种棋子替换成另外一些棋子。实现整个自动化跳棋装置的规则设定相当复杂,限于篇幅這里只给出局部的规则示例,图8中所列的规则,就可以实现部分跳跃动作。

为了实现自动跳棋装置,需要引入一些辅助的棋子,分别用“a”“b”“c”“d”“.”“_”等符号代表。“a*-->.b”的意思是,把“a*”棋子替换成“.b”棋子。单独看这个替换规则,是难以发现其中的意义的,但这些规则组合起来使用,就能产生出类似程序变量赋值和分支语句判断的效果(必须试一下才能体会到)。

接下来,还要思考这个装置可能是怎样制造出来的:假设有i1和i2两个检测器,当i1检测器检测到“a”,并且i2检测器检测到“b”时,则把检测到的棋子替换成“.b”,在所有匹配和替换操作完成后,检测器右移到新的位置重复刚才的操作。可以发现,这里用到了与的逻辑运算。

假设初始时,棋子按“a****_”的方式摆放,那么只要反复地按以上匹配替换序列操作,棋子的状态就会成为“.....###_.”。

可见,这个自动装置完成了两项任务,一是“*”号跳棋在跳过“*”号跳棋后变成了“#”号跳棋,二是“*”号跳棋在跳过“#”号跳棋后消失。按类似的思路,将替换规则加以扩展,就可以实现完整的自动跳棋了。为了测试方便,可使用带宏功能的文字编辑器,如WPS、Notepad++等来进行实验。当然,这个自动匹配替换规则的装置并非最底层的实体装置,可以使用存储器和逻辑门使其进一步实体化。在借助跳棋游戏来实现计算三角形数或自然数数列和的过程中,展现出一个相互依赖的层次系统,如图9所示。

从计算思维培养的目标看,是希望学习者能够认识到变换规则实体化过程中层次的存在,并从中领会到当前实现某种计算的变换规则系统,是如何依赖更底层的某个系统的变换规则来实现的。最后需要说明的是,虽然借助变换规则的实体化,可以实现并体验某个特定的计算任务进行的过程,但如果目标不是为了实现某特定的计算任务,而是要创造出一个具有通用计算能力的装置,必然需要设计一个特殊的实体化的装置,这个装置拥有能将各种实现特定计算任务的实体化装置同构为一个虚拟装置的能力,显然,对这个问题的理解还依赖更高阶、更综合的思维。

猜你喜欢

棋子画图实体
低段教学如何妙用画图策略
实体钱
最强大脑:棋子方阵
2017实体经济领军者
洛斯警长的终极挑战(12)
思考物理问题之“画图法”策略
重振实体经济
画图找答案
巧移棋子
趣味画图欢乐PK