梁見(jiàn)斌 浙江省余姚二中
曹偉 江蘇省鹽城市鹽都區(qū)龍岡小學(xué)
信息科技中的算法與程序設(shè)計(jì)教學(xué)越來(lái)越來(lái)重視計(jì)算思維,而計(jì)算思維的形成也要基于程序結(jié)構(gòu)進(jìn)行算法表達(dá),對(duì)順序、分支、循環(huán)三種基本程序結(jié)構(gòu)的學(xué)習(xí)是對(duì)算法認(rèn)知的基礎(chǔ)。那么,應(yīng)如何深度學(xué)習(xí)程序結(jié)構(gòu)也即影響算法思維形成深度呢?筆者認(rèn)為,教師需要在教學(xué)中盡最大可能去剝開(kāi)這些“結(jié)構(gòu)”的堅(jiān)硬果殼,學(xué)生才能夠吃到里面的果肉,吸收其營(yíng)養(yǎng),發(fā)展其思維。
在相同程序結(jié)構(gòu)的不同代碼對(duì)比中,可以體會(huì)到循環(huán)中各種變量的變化,從而洞察循環(huán)的特征與意義。
在講解算法的循環(huán)結(jié)構(gòu)時(shí),我常用的方法是先根據(jù)算法設(shè)計(jì)繪制出流程圖,然后把流程圖“翻譯”成源代碼。今天,舉的例子是最常見(jiàn)的計(jì)算累加值,如s=1+2+3+…+10。教師先繪制出流程圖(如上頁(yè)圖1)。
圖1
接下來(lái),學(xué)生們自行選擇使用for循環(huán)語(yǔ)句或者while循環(huán)語(yǔ)句來(lái)實(shí)現(xiàn)程序功能。學(xué)生們都低頭寫(xiě)代碼,我在巡視。突然,小A同學(xué)發(fā)問(wèn):“老師,這個(gè)流程圖描述的算法不嚴(yán)謹(jǐn)!”我一愣:“為什么?”小A:“因?yàn)樗鼪](méi)有輸出。算法的特征之一是必須有一個(gè)或多個(gè)輸出,程序結(jié)束之前應(yīng)該輸出s的值?!蔽覟樗Q起了大拇指:“小A同學(xué)很認(rèn)真!程序中有兩個(gè)變量,大家索性在循環(huán)體外把它們的值都輸出來(lái)吧?!焙芸欤蟛糠謱W(xué)生的代碼都寫(xiě)好了,我請(qǐng)小A來(lái)展示他的代碼(如上頁(yè)圖2)。
圖2
小A驕傲地說(shuō):“老師,我是嚴(yán)格地按照流程圖編寫(xiě)代碼。程序輸出結(jié)果為s=55,i=11。”我再次為小A豎起了大拇指:“不錯(cuò)!算法邏輯清晰,代碼簡(jiǎn)明規(guī)范。還有別的不同做法嗎?”這時(shí)響起一個(gè)聲音:“我的結(jié)果怎么和他不一樣!”說(shuō)話(huà)的是小B,“我用的是for循環(huán),算法邏輯和流程圖相同,但輸出結(jié)果中i的值為10(如圖3)?!?/p>
圖3
我順勢(shì)引導(dǎo):“算法邏輯確實(shí)是一樣的,為什么循環(huán)結(jié)束后變量i的值不同呢?”在Python中for循環(huán)的運(yùn)行機(jī)制確實(shí)與while循環(huán)不一樣,它的循環(huán)次數(shù)在一開(kāi)始就確定了,即使中途修改循環(huán)變量的值,也不影響循環(huán)的次數(shù)。大家可以看看這段代碼(如圖4),猜猜程序輸出的結(jié)果是什么?
圖4
這段代碼會(huì)正常結(jié)束嗎?好像出現(xiàn)死循環(huán)了!事實(shí)上并沒(méi)有出現(xiàn)死循環(huán),程序輸出結(jié)果為:s=55,i=9。這說(shuō)明什么問(wèn)題?循環(huán)次數(shù)在一開(kāi)始就確定了,與i的值無(wú)關(guān)。再看一個(gè)例子(如圖5),大家猜猜程序能否正常結(jié)束?若能正常結(jié)束,則程序輸出的結(jié)果是什么?
圖5
每執(zhí)行一次循環(huán)就把s的值插入到a的尾部,這樣列表a會(huì)越來(lái)越長(zhǎng),循環(huán)永遠(yuǎn)也不會(huì)結(jié)束了吧?但是,事實(shí)上也沒(méi)有出現(xiàn)死循環(huán),程序輸出結(jié)果為:s=55,i=9。聰明的你知道原因所在了嗎?循環(huán)結(jié)束后,a的值為多少呢?
不同的循環(huán)構(gòu)成的原理與使用的方式是不同的,在觀察中對(duì)比分析是一種很好的探索學(xué)習(xí)。while循環(huán)和for循環(huán)的運(yùn)行機(jī)制不一樣。while循環(huán)利用循環(huán)條件判斷是否執(zhí)行循環(huán)體,當(dāng)循環(huán)條件為假時(shí)循環(huán)結(jié)束;而for循環(huán)是使用迭代器協(xié)議訪問(wèn)對(duì)象,循環(huán)結(jié)束時(shí)i指向序列最后一個(gè)元素。平時(shí),可能并不一定遇見(jiàn)或發(fā)現(xiàn)一些奇怪的問(wèn)題,因此制造問(wèn)題也是重要的策略之一,如流程圖缺少了輸出語(yǔ)句,是讓學(xué)生學(xué)會(huì)分析問(wèn)題的一個(gè)契機(jī)。在調(diào)試程序4時(shí),也會(huì)發(fā)現(xiàn)len的計(jì)算值已然容易理解。如果不是len(),直接用a呢?這屬于迭代探索,不妨運(yùn)行觀察,會(huì)有更大困惑。教學(xué)雖不宜繼續(xù)挖掘,但的確也很有意思,能夠啟發(fā)探索。
循環(huán)語(yǔ)句的嵌套很多學(xué)生都似懂非懂,不得要領(lǐng)。在一次課堂的意外發(fā)現(xiàn)中,讓循環(huán)嵌套有了更好的詮釋?zhuān)瓉?lái)循環(huán)嵌套與迭代思維還存在著很大的關(guān)聯(lián)效應(yīng)。
(1)觀察循環(huán)次數(shù)與旋轉(zhuǎn)角度的關(guān)系。在講授Python程序設(shè)計(jì)turtle畫(huà)圖模塊時(shí),我讓學(xué)生用for循環(huán)語(yǔ)句繪畫(huà)常見(jiàn)的幾何圖形,學(xué)生很快就繪畫(huà)出各種常見(jiàn)的幾何圖形,有長(zhǎng)方形、正方形、正六邊形等(如下頁(yè)圖6)。而原本,只是想讓學(xué)生探究出重復(fù)執(zhí)行的次數(shù)和旋轉(zhuǎn)角度之間的關(guān)系,即兩者相乘的積為360。
圖6
(2)從循環(huán)次數(shù)擴(kuò)增到循環(huán)嵌套的迭代。在課堂巡視的過(guò)程中,我有了意外的發(fā)現(xiàn),有個(gè)別調(diào)皮的學(xué)生將循環(huán)計(jì)數(shù)次數(shù)改得比較大,如50,100等,同樣也畫(huà)出了圓形(如圖7)。
圖7
看到這,我心生一計(jì),何不以此讓學(xué)生探究循環(huán)語(yǔ)句的嵌套?這是非常好的課堂教學(xué)機(jī)智,何樂(lè)而不為呢?于是,我讓學(xué)生在剛才繪畫(huà)的圖形中選擇一種圖形,將腳本代碼進(jìn)行一次復(fù)制并修改,看看會(huì)產(chǎn)生什么樣的新圖形(如圖8)。
圖8
我正準(zhǔn)備用軟件選擇一個(gè)學(xué)生的作品進(jìn)行針對(duì)性講解與評(píng)價(jià),但無(wú)意中選擇了平時(shí)特別調(diào)皮的一位學(xué)生,心想他肯定不會(huì)做,正準(zhǔn)備重新選擇,可選擇的電腦界面引起了我的注意,于是我立馬放大了界面進(jìn)行廣播:“同學(xué)們,這個(gè)圖案是不是特別美(如圖9),像極了一個(gè)圓形。告訴老師,這是誰(shuí)畫(huà)的?”
圖9
“老師,是張小明?!蔽医又鴨?wèn)道:“哪位同學(xué)來(lái)解釋一下這個(gè)程序(如圖10)?最里面的循環(huán)語(yǔ)句結(jié)構(gòu)是一個(gè)正方形的程序,而外面循環(huán)語(yǔ)句結(jié)構(gòu)是控制正方形旋轉(zhuǎn)的程序。那外部循環(huán)的次數(shù)多少才合適呢?你能用一句話(huà)描述什么是循環(huán)嵌套嗎?”學(xué)生回答:“周而復(fù)始就是循環(huán)中的循環(huán),也就是將多個(gè)循環(huán)語(yǔ)句嵌套在一起使用?!?/p>
圖10
我接著說(shuō)道:“同學(xué)們,看看這個(gè)圖形(如圖11),你能看出這個(gè)圖形的基礎(chǔ)圖形是什么嗎?又是如何控制這個(gè)圖形的旋轉(zhuǎn)來(lái)繪畫(huà)出這個(gè)組合圖形的呢?”“老師,我發(fā)現(xiàn)基礎(chǔ)圖形是一個(gè)小正方形,是用兩個(gè)計(jì)數(shù)循環(huán)語(yǔ)句來(lái)控制的,是通過(guò)旋轉(zhuǎn)小正方形形成的新圖形?!庇械膶W(xué)生發(fā)現(xiàn)了秘密。為了讓學(xué)生能夠更好地理解兩層循環(huán)的嵌套,我讓學(xué)生修改外層循環(huán)的計(jì)數(shù)參數(shù),試試會(huì)產(chǎn)生哪些漂亮的圖案。
圖11
(3)多層循環(huán)嵌套產(chǎn)生循環(huán)嵌套迭代效應(yīng)。在課堂巡視的過(guò)程中,我發(fā)現(xiàn)有學(xué)生將剛才的循環(huán)語(yǔ)句多復(fù)制了一次,出現(xiàn)了三個(gè)循環(huán)語(yǔ)句嵌套在一起的現(xiàn)象(如圖12),產(chǎn)生了如圖13所示的圖案。有了內(nèi)循環(huán)產(chǎn)生基礎(chǔ)圖形,二層循環(huán)控制基礎(chǔ)圖形的旋轉(zhuǎn)的基本概念模型,我于是趁熱打鐵,借著這位學(xué)生的圖案,讓學(xué)生來(lái)研究三層循環(huán)嵌套中最外層循環(huán)的作用又是什么。
圖12
圖13
在學(xué)生自主探究三層循環(huán)過(guò)程中,有學(xué)生將最外層計(jì)數(shù)循環(huán)參數(shù)改得較大,發(fā)現(xiàn)產(chǎn)生了各式各樣的圖形圖案。為了更方便觀察循環(huán)的過(guò)程,我讓學(xué)生降低海龜畫(huà)圖的速度,仔細(xì)觀察發(fā)現(xiàn),原來(lái)循環(huán)是一個(gè)整體,可以將每個(gè)循環(huán)部分分開(kāi)來(lái)看,只需要把握每一個(gè)循環(huán)部分的功能就可以很好地理解循環(huán)嵌套。
借助學(xué)生課堂的教學(xué)生成,有利于因勢(shì)利導(dǎo)組織探究活動(dòng)。將循環(huán)嵌套與迭代思維相結(jié)合的方式,能幫助學(xué)生理解什么是循環(huán)嵌套,從兩層循環(huán)到三層循環(huán)的過(guò)渡恰到好處。這樣的教學(xué)體驗(yàn)與探究過(guò)程可以有效幫助學(xué)生理解循環(huán)嵌套語(yǔ)句,初步認(rèn)知迭代思維,從逆向思維的視角來(lái)看,學(xué)生經(jīng)歷了抽象、建模、表征等過(guò)程,這些過(guò)程是發(fā)展學(xué)生計(jì)算思維的重要方法。