波利亞在《如何解題》里有一段話:
我們專注于預(yù)期的結(jié)果,并將我們期望的最終結(jié)果可視化,然后思考:要達(dá)到最終的位置,我們之前要達(dá)到哪個(gè)位置?
這是一種逆向思維,從預(yù)期的結(jié)果反推所需的過(guò)程、步驟、策略。在數(shù)學(xué)里常用這種方法解題,叫做倒推法。舉個(gè)例子:
甲、乙、丙三個(gè)小朋友共有畫(huà)片120張,如果甲給乙13張,乙給丙 23張后,他們每人的張數(shù)相等。原來(lái)三人各有畫(huà)片多少?gòu)?
思路解析:三人的畫(huà)片總數(shù)沒(méi)有變化,最后還是120張,“他們每人的張數(shù)相等”,每人都有120÷3=40(張),這是“最終的位置”。
接下來(lái)看看在到達(dá)最終位置,我們之前要達(dá)到哪個(gè)位置:
先看看甲的畫(huà)片張數(shù)的變化:“甲給乙13張”,甲減少的13張,應(yīng)還回去,40+13=53(張),甲原來(lái)有53張畫(huà)片;
再看乙的畫(huà)片張數(shù)變化:“甲給乙13張,乙給丙23張”?!耙医o丙23張”,乙減少的23張畫(huà)片應(yīng)還回去40+23=63(張);“甲給乙13張”,乙增加的13張,應(yīng)把它去掉,63--13=50(張),乙原來(lái)有50張畫(huà)片;
最后再看看丙的畫(huà)片張數(shù)的變化:“乙給丙23張”,丙增加的23張,應(yīng)把它去掉,40-23=17(張),丙原來(lái)有17張畫(huà)片。*
在機(jī)器人課堂來(lái)里設(shè)計(jì)程序時(shí),分解完任務(wù)之后,思考每一步具體如何實(shí)現(xiàn)時(shí),最常用的方法就是這種逆向思維。
首先需要明確的就是我這一步到底要干嘛,比如左轉(zhuǎn)。
一般孩子思考到這一步就覺(jué)得完事了,左轉(zhuǎn)嘛,簡(jiǎn)單:
A馬達(dá)速度0
B馬達(dá)速度50
結(jié)果就是小車轉(zhuǎn)彎轉(zhuǎn)個(gè)不停。
用逆向思維思考應(yīng)該是怎么樣呢:
我這一步的目的是左轉(zhuǎn)到面向左邊為止,然后這一步結(jié)束。什么意思,就是當(dāng)我轉(zhuǎn)到面向左邊的時(shí)候要停下來(lái),并且停止這一步的動(dòng)作。
發(fā)現(xiàn)沒(méi),前面那個(gè)左轉(zhuǎn)是一個(gè)沒(méi)有結(jié)束的動(dòng)作,而下面那個(gè)有始有終,代表了一個(gè)完整的事件過(guò)程。
還沒(méi)完,但孩子知道事件是會(huì)結(jié)束的時(shí)候,他就會(huì)接著思考,那要怎么知道我要轉(zhuǎn)到什么時(shí)候呢,也就是終止?fàn)顟B(tài)是什么。他們最容易想到的就是延時(shí),然后停車。
這個(gè)方法不是不行,而是有更好的。用延時(shí)控制什么時(shí)候停止,受到電池電量干擾比較大,每次的結(jié)果都是不確定的,這不是一個(gè)好的控制,控制講究的是精確可控,我一定要知道我這一步能得到什么樣的效果。那這個(gè)更好的方法就是一個(gè)有較高確定性的結(jié)果,就是用光電去感應(yīng),當(dāng)我光電感應(yīng)到了黑線,我就知道,是時(shí)候展現(xiàn)真正的技術(shù),啊不,是時(shí)候停止了。課上我稱這個(gè)時(shí)刻為“終止條件”。
這個(gè)終止條件把我們正在做的這一步一分為二,在到達(dá)終止條件之前,跟到達(dá)終止條件之后。我給前后兩個(gè)狀態(tài)都取了名字,之前叫“這一步干啥”,之后叫“終止?fàn)顟B(tài)”。到這里,就可以套用一個(gè)簡(jiǎn)單的程序框架:如果否則。
這個(gè)就像填空題,如果后面一個(gè)空,執(zhí)行后面一個(gè)空,否則后面一個(gè)空。分別填什么:終止條件,終止?fàn)顟B(tài),這一步干啥。
如果:終止條件
執(zhí)行:終止?fàn)顟B(tài)
否則:這步干啥
到這里其實(shí)分析的工作可以先告一段落,接下來(lái)就是要落實(shí)到程序了。
- 終止條件:光電遇黑,那機(jī)器人怎么知道光電遇黑了呢,因?yàn)閷W(xué)到這一步的孩子基本都知道這個(gè)原理,這里就不多說(shuō)了,直接來(lái):端口模擬值<1500(臨界值需要測(cè)試);
- 終止?fàn)顟B(tài):停車,也就是馬達(dá)速度設(shè)為0;
- 這一步干嘛:左轉(zhuǎn)呀,不好意思機(jī)器人聽(tīng)不懂左轉(zhuǎn),好的咯,A馬達(dá)速度0,B馬達(dá)速度50(這速度也是要根據(jù)實(shí)際情況調(diào)整)。
最后再把這三個(gè)丟進(jìn)如果否則里。
如果:端口模擬值<1500
執(zhí)行:馬達(dá)A速度0
馬達(dá)B速度0
否則:馬達(dá)A速度0
馬達(dá)B速度50
搞定完事,下載測(cè)試。
誒,為啥我的小車還是不停啊。
我們回到下載前,機(jī)器人知道要遇黑停車,可是它怎么知道它什么時(shí)候遇黑,所以讓它需要不斷檢測(cè)遇黑了沒(méi)有,關(guān)鍵詞“不斷檢測(cè)”,這就需要循環(huán)來(lái)幫忙了。在運(yùn)用逆向思維的過(guò)程中,一定要時(shí)刻牢記我們的預(yù)期結(jié)果是什么以及每一步推理?xiàng)l件的嚴(yán)謹(jǐn),我們的預(yù)期結(jié)果是停止,結(jié)束這一步動(dòng)作。一旦加上循環(huán),這一步就沒(méi)法結(jié)束了,所以還要在終止?fàn)顟B(tài)里加上中斷循環(huán)。
一直循環(huán)
如果:端口模擬值<1500
執(zhí)行:馬達(dá)A速度0
馬達(dá)B速度0
中斷循環(huán)
否則:馬達(dá)A速度0
馬達(dá)B速度50
好啦,這回下載,運(yùn)行,成功。
上面這一個(gè)過(guò)程,一步一步從預(yù)期目標(biāo)得到我們要的步驟策略,這樣的一個(gè)過(guò)程也是在不斷踐行逆向思維的過(guò)程。
在《追求理解的教學(xué)設(shè)計(jì)》里提出課這樣一個(gè)概念,衡量“理解”的一個(gè)基本指標(biāo)是能把所學(xué)的知識(shí)遷移到新的環(huán)境和挑戰(zhàn)中,而不僅僅是知識(shí)的回憶和再現(xiàn)。孩子們?nèi)绻軌蛟跈C(jī)器人課堂把逆向思維反復(fù)的練習(xí),不管是能輕松完成各種任務(wù),還是磕磕碰碰的前進(jìn),在我看來(lái)這都不重要,重要的是他們能否可以把這樣的思維方式應(yīng)用在機(jī)器人課堂外的地方,這樣的意義遠(yuǎn)超機(jī)器人課堂上的表現(xiàn)。
寫(xiě)了這么多,來(lái)一只貓鎮(zhèn)樓吧。
