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