仲軼宏 江蘇省蘇州市吳江中學(xué)
計(jì)算思維是信息科技學(xué)科核心素養(yǎng)之一,計(jì)算思維教育已成為信息科技課程改革的趨勢。因此,筆者嘗試在教學(xué)中借助古代經(jīng)典數(shù)學(xué)的問題情境,讓學(xué)生真實(shí)參與到計(jì)算機(jī)解決問題的過程中,體驗(yàn)以“問題”為載體的思維過程,即發(fā)現(xiàn)問題、分析問題和解決問題的過程,實(shí)現(xiàn)思維的發(fā)散與碰撞,培養(yǎng)學(xué)生思維。
良好的情境可以激發(fā)學(xué)生的學(xué)習(xí)興趣,活躍課堂氣氛,增強(qiáng)學(xué)生的求知欲。教師播放《雞兔同籠》動畫視頻,視頻中的“雞兔同籠”問題被寫在《孫子算經(jīng)》中,引導(dǎo)學(xué)生還原《孫子算經(jīng)》上的雞兔同籠數(shù)學(xué)題:“今有雉兔同籠,上有三十五頭,下有九十四足,問雉兔各幾何?”本環(huán)節(jié)從直觀情境感悟?qū)嶋H問題,抽象提煉出隱含的數(shù)學(xué)問題,激發(fā)學(xué)生的探究興趣。在情境中喚醒學(xué)生的知識儲備、活動經(jīng)驗(yàn)和探究興趣,這樣的情境有助于學(xué)生深入探究。
算法是對特定問題求解的描述,是一系列問題的清晰指令。教師圍繞“雞兔同籠”問題,對學(xué)生進(jìn)行異質(zhì)分組,以小組為單位,思考解決問題的方法。各小組展開頭腦風(fēng)暴,有的利用假設(shè)法、列舉法等求解,有的設(shè)變量利用方程式快速求解,有的借助電子表格軟件列舉求解,還有的編寫程序求解……最終歸納總結(jié)出人工計(jì)算、借助電子表格軟件工具和編程計(jì)算三種方式。教師借此拋出課堂任務(wù)一:如何利用WPS電子表格來解決“雞兔同籠”問題?
“上有三十五頭”,即雞和兔的總數(shù)為35,那么列表的時(shí)候把雞和兔可能的組合都列出來(雞1,兔34;雞2,兔33……雞33,兔2;雞34,兔1),分別利用WPS表格中的公式計(jì)算兔腳總數(shù)、雞腳總數(shù)和雞兔腳總數(shù),利用公式復(fù)制便可以快速列出所有組合,如圖1所示。然后利用數(shù)據(jù)篩選功能,根據(jù)自定義條件(雞兔腳總數(shù)=94),便可以快速找出符合要求的雞兔組合。
圖1 雞兔同籠WPS列表法
本環(huán)節(jié)學(xué)生通過小組討論,把問題抽象出來,通過自然語言描述,形成了多種解題思路,鍛煉了分析問題的能力,體驗(yàn)了人工算術(shù)運(yùn)算與借助WPS表格實(shí)現(xiàn)計(jì)算機(jī)領(lǐng)域的計(jì)算的差異。算法就是解決問題的方法和步驟,自然語言背后承載著人類的符號化思維方式,但語言符號不夠直觀,有沒有更加直觀、形象的算法表述方式呢?
流程圖是使用圖形表示算法思路的一種方法,也是進(jìn)行計(jì)算機(jī)編程的重要步驟。相比自然語言,流程圖更形象、直觀,容易理解,它將各種輸入、處理、判斷、輸出進(jìn)行了有效關(guān)聯(lián),通過流程圖,把獨(dú)立存在的個(gè)體組成了一個(gè)新的整體結(jié)構(gòu)。畫程軟件為繪制流程圖提供了便利,并且可以將流程圖生成相應(yīng)的Python程序,進(jìn)行調(diào)試運(yùn)行。借此教師拋出第二個(gè)課堂任務(wù):利用畫程軟件,修改完善“雞兔同籠”問題的流程圖,并體驗(yàn)調(diào)試運(yùn)行程序,如圖2和圖3所示。
圖2 雞兔同籠流程圖
圖3 雞兔同籠程序代碼
通過流程圖描述,讓學(xué)生對算法進(jìn)行思辨,形成完整的結(jié)構(gòu)系統(tǒng),這樣不但簡化了算法抽象,還提升了解決問題的能力,使學(xué)生會一種,通一類,實(shí)現(xiàn)舉一反三。從流程圖到程序代碼,這個(gè)過程是對前面發(fā)現(xiàn)、分析、解決問題能力的提升,是將解決問題過程實(shí)戰(zhàn)化。它既是思維挑戰(zhàn),也是思維成果的展現(xiàn),且重在思維的訓(xùn)練,而非代碼本身,使學(xué)生的結(jié)構(gòu)化思維能力和邏輯思維能力得到提升。另外,從人工計(jì)算轉(zhuǎn)變?yōu)橛?jì)算機(jī)編程,通過小組團(tuán)隊(duì)協(xié)作,增進(jìn)了學(xué)生對算法思想的理解。也就是說,從問題抽象到數(shù)學(xué)建模,從算法設(shè)計(jì)到流程圖,從程序代碼編寫到調(diào)試優(yōu)化,這一過程使學(xué)生能夠更好地體驗(yàn)和區(qū)分計(jì)算機(jī)解決問題與人工計(jì)算的差異。
實(shí)現(xiàn)了程序代碼,并不一定是優(yōu)秀的算法設(shè)計(jì)。嚴(yán)謹(jǐn)?shù)乃季S和算法設(shè)計(jì),是程序編寫的前提。通過上述程序的調(diào)試運(yùn)行不難發(fā)現(xiàn),任意輸入head和leg的值,其實(shí)可能是無解的,程序最后無法給出兔和雞的值,但卻沒有任何提示。這是因?yàn)樵谠O(shè)計(jì)算法的時(shí)候不嚴(yán)謹(jǐn),考慮不周全。為了更好地優(yōu)化算法,教師可以提醒學(xué)生設(shè)置一個(gè)初始值變量,如answer=False,在for循環(huán)的結(jié)構(gòu)中添加if語句做判斷,即:當(dāng)條件為真時(shí),通過break跳出循環(huán)結(jié)構(gòu);當(dāng)判斷answer為真時(shí),輸出ji和tu的數(shù)量,否則輸出“此題無解,請重新輸入”。借此拋出第三個(gè)課堂任務(wù):優(yōu)化“雞兔同籠”程序代碼,并完善程序輸出。
判斷算法優(yōu)劣的關(guān)鍵是算法效率。在本題中,教師采用了嵌套的雙重for循環(huán)結(jié)構(gòu),其實(shí)其運(yùn)行效率會較低,可以再次優(yōu)化算法,通過兔子和雞之間的數(shù)量關(guān)系,把雙循環(huán)變成單循環(huán)(如圖4),以減少循環(huán)運(yùn)行的次數(shù),提高算法效率。優(yōu)化算法的過程,不僅考驗(yàn)學(xué)生的發(fā)散性思維,還考驗(yàn)學(xué)生算法設(shè)計(jì)思維的嚴(yán)謹(jǐn)性,同時(shí)學(xué)生在優(yōu)化算法的過程中不斷碰撞出思維的火花,有助于養(yǎng)成良好的思維習(xí)慣,提升計(jì)算思維。
“拓”意為開辟,“展”取張開、放開之意;遷移則為離開原來的所在地而另換地點(diǎn)。設(shè)計(jì)這個(gè)環(huán)節(jié)是將課堂中學(xué)到的知識轉(zhuǎn)化為一種能力,開拓學(xué)生視野,活躍學(xué)生思維,以解決新的問題。雞兔同籠問題雖然能很好地利用人工計(jì)算—WPS表格—編程三種方式解決問題,但學(xué)生難免有疑惑:花兩分鐘用方程式就能解決的問題,為什么要花更多的時(shí)間去用WPS列表法,或者學(xué)習(xí)Python編程解決呢?這不符合實(shí)際解決問題的需要。借此設(shè)計(jì)第四個(gè)(拓展)課堂任務(wù):請選擇合適的方法求解“百雞百錢”問題。
人工計(jì)算:這是一個(gè)用方程式無法解決的問題,因?yàn)橛腥齻€(gè)變量,但卻只能列兩個(gè)方程式,顯然是無法求解的。WPS表格方式:利用WPS列表法,設(shè)計(jì)好字段和列舉方式,是可以實(shí)現(xiàn)的,但比較復(fù)雜耗時(shí),需要先對問題進(jìn)行分析,規(guī)劃設(shè)計(jì)好相應(yīng)字段,才有利于問題求解。那么如何設(shè)計(jì)WPS表格字段呢?
題中共有6個(gè)變量字段即公雞、母雞、小雞各自的價(jià)格和數(shù)量和2個(gè)常量字段即總數(shù)量和總價(jià)。全部列舉顯然會使表格非常復(fù)雜。通過引導(dǎo)、分析和優(yōu)化,選取公雞數(shù)量、母雞數(shù)量、小雞數(shù)量(100-公雞數(shù)量-母雞數(shù)量)和總價(jià)(公雞數(shù)量*5+母雞數(shù)量*3+小雞數(shù)量*1/3)四個(gè)字段即可,把三個(gè)價(jià)格字段直接納入總價(jià)公式中。那么,怎么列舉呢?首先要考慮公雞、母雞、小雞可能的最大范圍??們r(jià)為100,公雞單價(jià)為5,那么最大的公雞數(shù)量是20,同理母雞數(shù)量為33。在列表的時(shí)候,可以依次固定公雞數(shù)量為1,列舉母雞數(shù)量范圍(1~33),公式計(jì)算小雞數(shù)量和總價(jià),依次類推……直到公雞數(shù)量到20,如圖5所示。最后利用數(shù)據(jù)自定義篩選(總價(jià)=100),便可以快速求出符合的購買組合。
圖5 百雞百錢WPS列表法
Python編程:編程的思路和WPS列表法類似,即在一定范圍內(nèi),逐個(gè)列舉并判斷其是否符合條件,若符合則輸出,這種由循環(huán)和判斷結(jié)構(gòu)組成的程序,其本質(zhì)是枚舉法,也稱窮舉法。把公雞、母雞和小雞分別定義成cock、hen和chick,循環(huán)結(jié)構(gòu)中公雞cock的范圍(1~20)、母雞hen的范圍(1~33)、小雞的范圍chick=100-cock-hen,設(shè)置雙重for循環(huán),內(nèi)嵌一個(gè)if條件判斷語句(cock*5+hen*3+chick/3==100),利用print語句輸出符合要求的公雞、母雞和小雞的數(shù)量組合即可,如圖6所示。
圖6 百雞百錢程序代碼
從“雞兔同籠”問題拓展到“百雞百錢”問題,在兩者的對比體驗(yàn)過程中,讓學(xué)生思維得以升華,既有同一個(gè)問題不同求解方法的縱向?qū)Ρ?,又有不同問題相同求解方法的橫向?qū)Ρ龋玫伢w驗(yàn)了在解決復(fù)雜問題時(shí),計(jì)算機(jī)編程更具優(yōu)勢,也解答了學(xué)生心中的疑惑。所以,在教學(xué)中,教師要基于問題視角,著眼于發(fā)現(xiàn)問題,精于看不見的算法設(shè)計(jì)思想,善于利用計(jì)算機(jī)編程解決問題,讓學(xué)生在具體問題情境的體驗(yàn)、探究、解決、運(yùn)用中實(shí)現(xiàn)思維的進(jìn)階。