孫旭萍
(杭州市余杭文昌高級中學,浙江 杭州)
目前基于技術素養培養的以實踐操作為重的課堂教學不能滿足計算思維培養的需要。因此,要改變以往教學的思路和方法,教師在實施教學的過程中,必須將計算思維的培養明確到教學目標中,因為教學目標是教學的核心和靈魂,圍繞著教學目標,才能順利有效地開展教學活動和評價。
枚舉算法是日常學習、生活、工作中用到的最普遍和最常規的算法,而且容易掌握。它利用計算機快速運算、高準確性的特點,列舉所有可能的情況,并根據篩選條件進行逐一檢查,找到符合條件的答案。讓學生在經歷問題解決的過程中體會枚舉算法的基本思想和程序實現是《課程標準》和《學科教學指導意見》對這個經典算法學習的指導性要求。
在教學設計時,筆者將枚舉算法的教學目標確定為:(1)了解枚舉算法的概念和基本思想;(2)能用程序代碼實現枚舉算法;(3)能運用枚舉算法解決生活中的實際問題,認識到算法和程序設計在解決問題過程中的地位和作用。枚舉算法的基本思路可以歸納為八個字:一一列舉,逐個檢驗。在實際使用中,“一一列舉”采用循環語句來實現;“逐個檢驗”采用選擇語句來實現。關于編程實現枚舉算法,根據枚舉算法的原理和計算思維處理問題的本質,可以將問題分解為三個子目標:(1)如何確定枚舉對象和枚舉范圍,做到不能遺漏,也要避免重復;(2)如何確定判斷條件,逐一驗證每個解是否是正確的解;(3)如何使可能解的范圍降至最小,以便提高解決問題的效率。通過以上三個子目標的解決引導學生建構正確的數學模型,確定枚舉方案,也是本節課需要突破的重難點。
這樣將復雜的算法思想和解決問題的過程分解為若干個子問題、子目標的教學思路同樣可以應用到其他經典算法的教學當中,學生在學習目標達成的過程中逐步提升計算思維的培養,體驗算法的魅力,加深學習算法的欲望。
在生活和學習中,人們經常會不經意間運用“枚舉算法”的基本原理進行問題的解決。比如,讓你用一串鑰匙去開一把鎖,但是不知道具體是用哪一把鑰匙,你就會一把一把地挨個地逐個嘗試,直至打開鎖為止。本節課,筆者設計的引入環節如下:
【情境】凱凱媽媽將家里的電腦設置了密碼,并告訴凱凱密碼是四位數的偶數,并且每個數位的數相同。請通過提示解密打開電腦。
【學生活動】嘗試解開密碼,并說出解開密碼的過程(重點描述思考過程)。
【教師引導】各位同學嘗試解開密碼的過程就是枚舉算法。
【思維拓展】如果這個密碼的四個位數上的數不同呢?
筆者通過一個簡單的、十分常見的小任務引入枚舉算法的主題,讓學生體會算法并不抽象,使其更有親切感,并親歷枚舉算法解決問題的基本思路:第一步,根據問題的要求,把所有可能的情況都考慮到,密碼可能是 2222、4444、6666、8888;第二步,對全部可能的結果(密碼)逐一進行判斷,過濾掉不符合要求的,直至找到正確的結果(密碼)。利用“思維拓展”的設置讓學生體會到人工窮舉的局限性,發揮計算解決問題的優勢,引發學生思考生活中的例子用計算機編程解決的必要性和意義。
在枚舉算法實例教學中,采用一個任務貫穿整個教學過程,這樣可以把一個問題講透,加深學生印象,筆者稱之為“主題任務”。筆者在這一環節設置了以下這些任務:
1.枚舉方案的設計及程序實現
【情境】最近警方抓獲一批制造偽鈔的犯罪分子,并發現制造假幣用的模板,但是由于受到損壞,個位數和百位數已經模糊不清,我們看到的后六位數僅僅是519□4□,同時據情報稱,在他們制造的這批假幣中,編號有一定的規律,后六位數能被42整除。請設計算法挑選出符合要求的人民幣編碼。
【學生活動】以4人小組討論、制定解決方案。
【教師引導】教師引導學生從以下兩個方面去思考并制定方案:
(1)先羅列:把各種可能的情況都考慮到,確定人民幣編碼列舉的范圍
(2)后篩選:對全部可能結果逐一進行判斷,確定篩選條件
【學生活動】小組討論分析問題、完成枚舉算法程序代碼解決問題。
筆者通過思維引導策略有目的性地將計算思維滲透到任務的設置中,啟發學生將抽象的概念進行數學建模,并用循環結構和選擇結構進行實現。培養界定問題、抽象特征、建立結構模型、確定算法的計算思維。以下是在實際的教學過程中,大多數學生出現的問題分析過程,也在筆者的預計之中:
①問題分析
先羅列范圍:這個6位數為519040-519949
后篩選條件:a.這個6位數的十位是4;
b.這個6位數能被42整除
針對以上問題分析,筆者給出了以下部分關鍵代碼,并留空,要求學生完成代碼填空,加強學生讀程序能力和基本語句應用能力。
②程序實現:完善程序關鍵代碼。
Dim x as integer,y as integer ′x表示6位整數,y表示十位上的數字
For x=to____step____
y=x10 mod 10 ′從6位數x中分離出十位上的數
If______then
Print x
Endif
Next x
學生經過個人思考、小組討論,最后以小組討論的形式給出整個方案,這一過程培養了學生合作探究能力和計算思維過程描述能力,讓學生積極主動地參與到課堂中來。任務進行到這里并沒有結束,筆者再次提出了新的拓展任務:在不遺漏任何一個正確解的前提下,如何縮小羅列的編碼范圍,從而達到循環結構循環次數減少的目的,來提高程序的執行效率,即實現程序最優化。學生面臨新的挑戰,產生更強烈的思維碰撞,激發解決問題的興趣,在教師引導、學生討論的過程中逐步完成以下新方案,進一步提升計算思維:
①問題分析 6位數 519 m4 n
先羅列范圍:m:1-9 n:0-9
后篩選條件:這個6位數能被42整除
②程序實現:完善程序關鍵代碼。
Dim m as integer,n as integer ′m表示百位上的數字,n表示個位上的數字
Dim x as integer ′x表示6位整數
For m=____to____step____
For n=____to____step____
x=519000+100*m+40+n
If______then
print x
Endif
Next n
Next m
這一環節任務的設置讓學生認識到枚舉策略的選擇對枚舉算法執行效率的影響,從而突顯計算思維對解決問題效率的重要性。培養學生多維度思考問題的習慣,提升計算思維的應用。最后筆者又設置了歸納總結和枚舉算法應用探討的任務。
2.歸納總結
【學生活動】(1)通過前面任務的完成過程歸納枚舉算法解決問題的基本思想
(2)通過連個方案代碼填空,總結枚舉算法程序控制結構
(3)聯系實際,歸納枚舉算法優缺點
3.拓展延伸
【學生活動】思考以下問題能用枚舉算法解決嗎?
(1)有蜘蛛、蜻蜓、蟬三種動物共18只,共有腿118條,翅膀20對(蜘蛛8條腿;蜻蜓6條腿,2對翅膀;蟬6條腿,1對翅膀),三種動物各幾只?
(2)求高一年級學生圖書館借閱人均冊數。
(3)如果存在這樣一個三位數:三位數等于它的每個數位上數字的立方和,如153=13+53+33,則我們稱此數為“水仙花數”。求100~999之間的全部水仙花數。
【歸納總結】從問題解決過程中提取歸納枚舉算法適用情況。
整個課堂教學中,學生經歷了分析問題、建構數學模型、確定算法、編程實現算法的基本過程,并在兩個枚舉方案的制定過程中領會枚舉算法解決問題的基本思路、算法優化和枚舉算法的適用范圍,在解決問題和完成任務中提升計算思維;教師通過組織學生討論和歸納、思維啟發等教學方式來培養學生的計算思維,從解決實際問題中親歷枚舉算法的實現和知識的遷移,并且在最后設置了枚舉算法的現實應用的探究,使算法的學習回歸到生活中。
因此,在高中信息技術課堂中,教師可以采用“主題任務”的教學模式來引導學生學習,整個任務中情境的發展必須圍繞著利用計算思維處理問題過程的思路而展開。學生在“主題任務”引導下進行探究,并且在任務完成時總結出知識規律、過程和方法,并將其遷移運用到其他的實際問題中。
在教學設計過程中,為了能夠進一步掌握學生認知和技能存在的差異,實施因材施教,教師要充分地做好備教材、備學情這一環節,然后根據計算思維培養目標進行教材的重組,為輔助教學資源的準備奠定基礎。
筆者在枚舉算法教學設計的時候,準備了自主學習任務單,而且在課前下發,使學生對上文中提到的任務有充分的時間去思考,為學生計算思維的培養和應用提供了載體。
教學資源的開發和使用情況有時會很大程度上影響一節課的效果,如何激發學習興趣、提高學生課堂參與度、促進學生學習探究等等,都是教師在教學資源開發時需要思考和解決的問題。教學資源的形式可以多樣化,比如流程圖、程序代碼、自主學習任務單、視頻動畫等,對于高中信息技術學科,教學資源可以更加的豐富。
在課堂教學結束時,教師為了檢驗學生知識點掌握情況,可以創建多元化的評價機制,為后續課程教學的設置和改進提供依據。多元評價,一方面可以是教師對學生的評價,綜合利用好過程性評價和總結性評價,在《枚舉算法》一課中,筆者根據學生在學習過程中的表現以及方案完成情況來評價學生計算思維解決問題的能力,由于學生基礎整體較弱,在程序代碼部分采用了留白填空來檢測學生對枚舉算法解決問題的達成度;另一方面借助學習任務單和評價表,完成學生自評和互評。筆者根據教學目標和計算思維培養目標設計了一份發展性評價表(如下表),學生在進行自評時,就能很清楚地知道自己掌握到什么程度,有利于教師完成教學設計的調整,進而再次強化學生的計算思維。

“用枚舉算法解決問題”發展性評價表
計算思維的培養是高中生解決問題思維能力提升的基本要求,因此教師在課程教學的過程中一定要注意計算思維的培養。但是,筆者認為高中信息課程中關于計算思維的培養和應用給予的重視還不夠,僅以《枚舉算法》一課為例,將計算思維的培養滲透到課程教學設計中,嘗試通過教師引導幫助學生定義問題、抽象特征、建構數學模型、設計合理算法的過程來形成解決問題的方案,并且在解決問題時總結出過程與方法,能夠舉一反三遷移到其他相關的問題解決之中,為學生核心素養的提升、解決問題能力的提高打下基礎。