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