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