波利亚在《如何解题》里有一段话:
我们专注于预期的结果,并将我们期望的最终结果可视化,然后思考:要达到最终的位置,我们之前要达到哪个位置?
这是一种逆向思维,从预期的结果反推所需的过程、步骤、策略。在数学里常用这种方法解题,叫做倒推法。举个例子:
甲、乙、丙三个小朋友共有画片120张,如果甲给乙13张,乙给丙 23张后,他们每人的张数相等。原来三人各有画片多少张?
思路解析:三人的画片总数没有变化,最后还是120张,“他们每人的张数相等”,每人都有120÷3=40(张),这是“最终的位置”。
接下来看看在到达最终位置,我们之前要达到哪个位置:
先看看甲的画片张数的变化:“甲给乙13张”,甲减少的13张,应还回去,40+13=53(张),甲原来有53张画片;
再看乙的画片张数变化:“甲给乙13张,乙给丙23张”。“乙给丙23张”,乙减少的23张画片应还回去40+23=63(张);“甲给乙13张”,乙增加的13张,应把它去掉,63--13=50(张),乙原来有50张画片;
最后再看看丙的画片张数的变化:“乙给丙23张”,丙增加的23张,应把它去掉,40-23=17(张),丙原来有17张画片。*
在机器人课堂来里设计程序时,分解完任务之后,思考每一步具体如何实现时,最常用的方法就是这种逆向思维。
首先需要明确的就是我这一步到底要干嘛,比如左转。
一般孩子思考到这一步就觉得完事了,左转嘛,简单:
A马达速度0
B马达速度50
结果就是小车转弯转个不停。
用逆向思维思考应该是怎么样呢:
我这一步的目的是左转到面向左边为止,然后这一步结束。什么意思,就是当我转到面向左边的时候要停下来,并且停止这一步的动作。
发现没,前面那个左转是一个没有结束的动作,而下面那个有始有终,代表了一个完整的事件过程。
还没完,但孩子知道事件是会结束的时候,他就会接着思考,那要怎么知道我要转到什么时候呢,也就是终止状态是什么。他们最容易想到的就是延时,然后停车。
这个方法不是不行,而是有更好的。用延时控制什么时候停止,受到电池电量干扰比较大,每次的结果都是不确定的,这不是一个好的控制,控制讲究的是精确可控,我一定要知道我这一步能得到什么样的效果。那这个更好的方法就是一个有较高确定性的结果,就是用光电去感应,当我光电感应到了黑线,我就知道,是时候展现真正的技术,啊不,是时候停止了。课上我称这个时刻为“终止条件”。
这个终止条件把我们正在做的这一步一分为二,在到达终止条件之前,跟到达终止条件之后。我给前后两个状态都取了名字,之前叫“这一步干啥”,之后叫“终止状态”。到这里,就可以套用一个简单的程序框架:如果否则。
这个就像填空题,如果后面一个空,执行后面一个空,否则后面一个空。分别填什么:终止条件,终止状态,这一步干啥。
如果:终止条件
执行:终止状态
否则:这步干啥
到这里其实分析的工作可以先告一段落,接下来就是要落实到程序了。
- 终止条件:光电遇黑,那机器人怎么知道光电遇黑了呢,因为学到这一步的孩子基本都知道这个原理,这里就不多说了,直接来:端口模拟值<1500(临界值需要测试);
- 终止状态:停车,也就是马达速度设为0;
- 这一步干嘛:左转呀,不好意思机器人听不懂左转,好的咯,A马达速度0,B马达速度50(这速度也是要根据实际情况调整)。
最后再把这三个丢进如果否则里。
如果:端口模拟值<1500
执行:马达A速度0
马达B速度0
否则:马达A速度0
马达B速度50
搞定完事,下载测试。
诶,为啥我的小车还是不停啊。
我们回到下载前,机器人知道要遇黑停车,可是它怎么知道它什么时候遇黑,所以让它需要不断检测遇黑了没有,关键词“不断检测”,这就需要循环来帮忙了。在运用逆向思维的过程中,一定要时刻牢记我们的预期结果是什么以及每一步推理条件的严谨,我们的预期结果是停止,结束这一步动作。一旦加上循环,这一步就没法结束了,所以还要在终止状态里加上中断循环。
一直循环
如果:端口模拟值<1500
执行:马达A速度0
马达B速度0
中断循环
否则:马达A速度0
马达B速度50
好啦,这回下载,运行,成功。
上面这一个过程,一步一步从预期目标得到我们要的步骤策略,这样的一个过程也是在不断践行逆向思维的过程。
在《追求理解的教学设计》里提出课这样一个概念,衡量“理解”的一个基本指标是能把所学的知识迁移到新的环境和挑战中,而不仅仅是知识的回忆和再现。孩子们如果能够在机器人课堂把逆向思维反复的练习,不管是能轻松完成各种任务,还是磕磕碰碰的前进,在我看来这都不重要,重要的是他们能否可以把这样的思维方式应用在机器人课堂外的地方,这样的意义远超机器人课堂上的表现。
写了这么多,来一只猫镇楼吧。