陳珊
● 教學(xué)內(nèi)容分析
枚舉算法是一種常用的基礎(chǔ)算法。依賴計算機的高速運算能力,枚舉算法能解決很多問題,如密碼破譯、搜索等。利用枚舉算法解決問題的關(guān)鍵是通過分析問題,確定枚舉對象、范圍和檢驗條件。另外,同一問題的枚舉方式可以多樣。本節(jié)課是枚舉算法的應(yīng)用,要求學(xué)生利用枚舉算法解決兩個具體問題——“百雞百錢”和密碼破解,讓他們在分析循環(huán)次數(shù)的基礎(chǔ)上,體會利用計算機的高速運算能力進行枚舉解決問題的優(yōu)勢。
● 學(xué)情分析
學(xué)生已經(jīng)學(xué)習(xí)了枚舉算法的概念,有利用分支、循環(huán)語句編寫程序解決問題的經(jīng)驗,但用枚舉算法解決具體問題時,枚舉對象、范圍、檢驗條件的確定還存在一定困難,對同一問題的不同枚舉方式認(rèn)識不到位,同時對利用計算機的高速運算能力進行枚舉解決問題的優(yōu)勢體會不強烈。本節(jié)課,筆者利用兩個具體問題,在體驗、討論、小組合作的過程中,讓學(xué)生經(jīng)歷枚舉算法解決實際問題的過程,體會枚舉算法的價值,了解人解決問題與計算機解決問題的差異。
● 教學(xué)目標(biāo)
知識與技能目標(biāo):進一步理解枚舉算法的思想,利用枚舉算法解決具體問題。
過程與方法目標(biāo):在解決“百雞百錢”、密碼破解問題的過程中,體驗利用枚舉算法解決問題的方法;通過小組合作,經(jīng)歷分析問題、設(shè)計算法、編寫/調(diào)試程序的過程。
情感態(tài)度與價值觀目標(biāo):感受利用計算機進行枚舉的優(yōu)勢,愿意用枚舉算法去解決生活、實踐中的問題。
● 教學(xué)重點、難點
重點:利用枚舉算法解決問題的一般過程。
難點:認(rèn)識到枚舉算法是利用計算機的高速運算能力來解決問題。
● 教學(xué)過程
1.導(dǎo)入環(huán)節(jié)
(1)情境導(dǎo)入:被“加密”的作業(yè)文件夾。
師:許多同學(xué)已經(jīng)發(fā)現(xiàn),今天的作業(yè)文件夾竟然被“加密”了。接下來,給大家一分鐘時間,親自動手嘗試“找回”作業(yè)文件夾的密碼。(PPT中1分鐘倒計時開始)
學(xué)生在緊張、興奮中開始嘗試“破解”作業(yè)文件夾密碼,1分鐘到了,但文件仍未打開(如圖1)。
(2)小組討論:破解密碼需要線索。
師:剛才是如何“找”密碼的?找回密碼存在什么困難?請大家圍繞這兩個問題開展討論。
師生互動,確定“找”密碼的過程就是枚舉,是人工在一一列舉所有可能的密碼(如“123456”“xinxi”等),逐一輸入檢驗?zāi)芊翊蜷_作業(yè)文件夾。由于密碼的位數(shù)、組成等特征未知,所以猜測密碼非常困難。學(xué)生要想破解作業(yè)文件夾密碼,需要一些線索。
2.活動一:解決“百雞百錢”問題,獲得密碼線索
(1)給出密碼線索一。
師:破解密碼需要兩條至關(guān)重要的線索。每個小組需要用10個積分來換取線索一。線索一描述:雞翁一值錢五,雞母一值錢三,雞雛三值錢一。百錢買百雞,問雞翁、雞母、雞雛各幾何?
(2)利用枚舉算法解決“百雞百錢”問題。
Step1:分析問題。
分析“百雞百錢”問題,學(xué)生抽象提煉出方程組(如圖2,公雞x只、母雞y只,小雞z只)。
小組開展討論:如何才能求解x、y、z的值?學(xué)生習(xí)慣從數(shù)學(xué)思維出發(fā),逐一人工湊數(shù)來求解這一不定方程組,也有學(xué)生嘗試消元后再找出符合條件的解。教師充分肯定這一思路,同時引導(dǎo)學(xué)生思考能否利用計算機來解決這一問題。學(xué)生認(rèn)同,可以利用枚舉算法解決“百雞百錢”問題。
Step2:設(shè)計算法。
小組討論枚舉對象、范圍和檢驗條件,寫在A3紙板上,并在全班展示交流“百雞百錢”問題的不同枚舉方式,進一步復(fù)習(xí)鞏固枚舉算法的三要素:枚舉對象、范圍和檢驗條件(如圖3)。
Step3:編寫、調(diào)試程序。
學(xué)生編寫、調(diào)試VB程序,運行得出“百雞百錢”問題的所有可能解。全班展示不同的程序?qū)崿F(xiàn),教師著重引導(dǎo)學(xué)生分析程序(三重循環(huán)、二重循環(huán)、一重循環(huán))的循環(huán)次數(shù),讓學(xué)生真實感受到計算機的高速運算能力,體會利用計算機進行枚舉的優(yōu)勢。同時,教師對比不同程序循環(huán)次數(shù)的差異,適當(dāng)解釋枚舉算法優(yōu)化的必要性(如下表)。
運行程序,得到“百雞百錢”問題的四組解,教師說明其中第二組解的數(shù)字(4、18、78)是破解密碼的線索一(如圖4)。
3.活動二:找回作業(yè)文件夾“密碼”
(1)給出密碼線索二。
師:在獲取線索一(4、18、78)后,許多同學(xué)立馬去嘗試打開作業(yè)文件夾,但都失敗了。因為,破解密碼還需要至關(guān)重要的線索二,小組依然需要用10積分換取線索二。線索二描述:密碼的首位數(shù)字是4,密碼的末位數(shù)字的三倍是18,密碼組成的四位數(shù)能被78整除。
(2)利用枚舉算法破解作業(yè)文件夾密碼。
Step1:分析線索,設(shè)計算法。
小組根據(jù)線索二,討論枚舉的對象、范圍和檢驗條件,寫在學(xué)案上。這一問題也有不同的枚舉方式,鼓勵學(xué)生有不同的想法,關(guān)注算法的多樣性(如圖5)。
Step2:編寫、調(diào)試程序。
小組根據(jù)確定的枚舉對象、范圍和檢驗條件,編寫VB程序,調(diào)試運行得出可能的密碼解(如圖6)。
Step3:驗證密碼,打開作業(yè)文件夾。
學(xué)生獲得解決問題的成就感。
4.知識延伸
筆者通過圖靈密碼破譯機、深藍、AlphaGo三個實例說明枚舉算法是利用計算機的高速運算能力來解決問題。在密碼破譯領(lǐng)域,暴力枚舉本身就是一種重要而基礎(chǔ)的方法。1997年戰(zhàn)勝國際象棋大師卡斯帕羅夫的“深藍”,暴力窮舉是其算法核心,2017年大熱的AlphaGo,其關(guān)鍵就包括蒙特卡洛算法——一種優(yōu)化的枚舉算法。筆者還特別提及了AlphaGo的硬件構(gòu)成,讓學(xué)生直觀感受計算機快速運算能力的基礎(chǔ)是強大的硬件支撐,并進一步提出了思考問題:生活中還有哪些運用枚舉算法解決問題的實例?鼓勵學(xué)生去尋找、發(fā)現(xiàn)枚舉算法。
5.總結(jié)
課堂總結(jié)分兩部分,一是知識總結(jié),包括枚舉算法的概念、特征及結(jié)構(gòu)特點,利用枚舉算法解決問題的過程等。二是對小組合作表現(xiàn)的總結(jié),匯總小組積分,獎勵積分最高小組。
● 教學(xué)反思
本堂課設(shè)計了兩個破解密碼的線索,環(huán)環(huán)相扣,讓學(xué)生跟隨“破解”作業(yè)文件夾的密碼這一主要任務(wù),經(jīng)歷利用枚舉算法解決兩個具體問題的過程(分析問題、設(shè)計算法、編寫調(diào)試程序),充分調(diào)動學(xué)生的興趣,學(xué)生參與度很高。
筆者從多角度、多途徑突破教學(xué)難點,讓學(xué)生在破解密碼的真實情境中主動尋找解決問題的方法,通過討論、對比手工枚舉(計算)與計算機枚舉的差異,讓他們直觀感受計算機高速運算速度所帶來的優(yōu)勢。在程序展示部分,筆者分析了程序的循環(huán)次數(shù),再次讓學(xué)生感受計算機的高速運算能力。同時,在知識延伸部分,筆者通過深藍、AlphaGo的實例,讓學(xué)生認(rèn)識到枚舉算法是利用計算機的高速運算能力來解決問題。
學(xué)生深刻體會到計算機軟硬件相結(jié)合的重要性,軟件功能的實現(xiàn)是基于硬件,這一點在枚舉算法上體現(xiàn)得尤其明顯。正是由于計算機硬件的發(fā)展,高速的運算能力才能得到保證,也才讓枚舉算法有了用武之地。在知識延伸部分,筆者讓學(xué)生認(rèn)識到枚舉算法的重要而廣泛的應(yīng)用,同時拋出一個思考問題,讓學(xué)生帶著問題離開課堂,鼓勵他們?nèi)グl(fā)現(xiàn)、觀察生活中枚舉算法應(yīng)用的實例。在解決兩個具體問題的過程中,筆者讓學(xué)生利用抽象的方法建立數(shù)學(xué)模型,設(shè)計算法,編寫程序,讓計算機自動化運行以解決具體的問題,以小組為單位完成算法設(shè)計、程序編寫、交流及展示活動,通過積分獎勵/兌換的形式,激勵學(xué)生,小組合作效果較好。
點 評
算法是計算機解決問題的鑰匙,如何配好這把鑰匙,是人的智慧。用計算機解決問題,就需要充分認(rèn)識到計算機的特點并充分運用其特點,發(fā)揮計算機的優(yōu)勢。在《枚舉算法的應(yīng)用》一課,學(xué)生通過了解圖靈在二次世界大戰(zhàn)期間破譯密碼的事例以及自己動手編寫解密程序等學(xué)習(xí)環(huán)節(jié),可以很好地達成這一教學(xué)目標(biāo)。
盡管枚舉算法是算法學(xué)習(xí)中一種簡單且容易理解的算法,但對初學(xué)算法的學(xué)習(xí)者來說,仍然是枯燥和抽象的?!睹杜e算法的應(yīng)用》一課引用“百雞百錢”和“文件夾密碼破解”相嵌套的問題場景,激發(fā)學(xué)生的挑戰(zhàn)欲和好奇心,在已經(jīng)掌握運用循環(huán)結(jié)構(gòu)實現(xiàn)枚舉算法的基礎(chǔ)上,完成更復(fù)雜問題解決方法的學(xué)習(xí)任務(wù)。
趣味性可以解決枚舉算法學(xué)習(xí)起步時的動機,對《枚舉算法的應(yīng)用》一課教學(xué)過程中生成性資源的進一步挖掘可以獲得更多的學(xué)習(xí)動機,因為枚舉算法的學(xué)習(xí)核心不只是有趣,也不是兩次枚舉算法重疊的簡單重復(fù)使用,而在于如何將待解決的問題有效地分解為可以重復(fù)執(zhí)行的循環(huán)結(jié)構(gòu)以及判別條件并以程序代碼的形式表達出來。在教學(xué)過程中,教師所展示的“百雞百錢”三種不同解決方案為深入研究枚舉算法的實施提供了空間,這一方面可以引導(dǎo)多重循環(huán)知識技能的學(xué)習(xí),另一方面也反映了如何有效發(fā)揮計算機優(yōu)勢即平衡計算機執(zhí)行效率和降低人的智力勞動強度關(guān)系的思想方法。與此同時,在解決“百雞百錢”問題之后,教師同樣用枚舉算法要求學(xué)生解決“文件夾密碼破解”,這時教師也可以設(shè)定不同的學(xué)習(xí)目標(biāo)要求,供不同學(xué)習(xí)層次的學(xué)生練習(xí)。