宋敏毅 江蘇省天一中學
《普通高中信息技術課程標準(2017年版)》將計算思維列為信息技術學科四大核心素養之一,并指出:具備計算思維的學生在信息活動中能夠采用計算機可以處理的方式界定問題、抽象特征、建立結構模型、合理組織數據;通過判斷、分析與綜合各種信息資源,運用合理的算法形成解決問題的方案;總結利用計算機解決問題的過程與方法,并遷移到與之相關的其他問題解決中。
因此,筆者將教科版高中信息技術必修一第四單元第二節“數值計算”的拓展練習內容與選修教材《算法初步》中算法應用模塊知識點相結合,設計了相應的教學項目,并將整個教學設計的思路總結為情境創設、初步探究、項目優化、項目總結四個階段,進而培養學生的問題解決與方案優化能力,發展其計算思維。
情境創設是為了更好地激發學生的好奇心和求知欲,使學生主動地參與到項目學習中,從而提升教學效率。因此,教師需要充分了解學生的年齡特點、知識基礎、認知水平以及學生的日常生活,并根據以上信息分析學生的普遍興趣點,以興趣點為基礎擴散思維,爭取為學生設計出更加生動、引人入勝的教學情境。
例如,根據必修一第四單元第二節“數值計算”的拓展練習內容,以及選修教材《算法初步》中算法應用模塊的內容,筆者選擇了最大公約數問題作為項目的驅動問題。在課前先展示一道比較簡單的求解兩個正整數的最大公約數的問題——20和8的最大公約數是多少,并在學生回答問題的時候設計了體現信息素養或提升趣味性的問答環節,如利用Python程序隨機選擇學生或擊鼓傳花等小游戲。在揭曉答案后,引導學生復習最大公約數的計算方法——窮舉法、短除法、分解質因數法、輾轉相除法等。接著,布置一道位數較多較復雜的正整數之間求解最大公約數的問題,如“9147485和5147480的最大公約數是多少”,要求學生利用計算機程序來解決。最后,提出項目學習目標——計算兩個正整數的最大公約數。
項目初步探究主要是在學生明確項目學習目標后,初步選擇一種方法嘗試解決問題。在本項目中,在設計解決“9147485和5147480的最大公約數是多少”這一問題的算法時,一定要以學生為主導,教師僅起到輔助學習的作用。
教師首先帶領學生回憶算法的概念與特征,并讓學生在求解最大公約數的四種方法中選擇較好理解且容易轉換為Python程序代碼的方法。其中,窮舉法最能體現計算機解決問題的常規思路,因為計算機可以不知疲倦地進行窮舉計算。窮舉法的另一個優勢是算法思路簡單易懂,只要通過窮舉嘗試所有可能的數,并找出最大的那個約數即可。手工計算非常復雜,但通過運行程序,學生會發現利用計算機程序來解決該問題難度就變小了。
在為學生介紹窮舉法的思路后,就可以讓學生嘗試將其轉換為Python代碼,從而解決“9147485和5147480的最大公約數是多少”這一問題。教師可以提出用for循環或者while循環來實現,圖1展示了一種基于while循環的樣例程序。在這一階段的項目任務單中,教師可提供while循環和for循環的相關信息讓學生參考,還可組織小組交流討論等學習活動讓同學們集思廣益,明晰窮舉法算法設計的思路。

圖1 窮舉法代碼
項目優化主要是在項目初步探究的基礎上對解決方案進行剖析,進一步探究更便捷、高效的解決方案,或者在初步方案的基礎上優化解決方案。在本項目中的項目優化則是指向基于同一問題選擇更高效的方法設計代碼,最直觀優化的指標就是算法的復雜度。
算法的時間復雜度是指執行算法所需要的計算工作量,可以用算法執行的基本運算次數度量;算法的空間復雜度是指執行算法需要的內存空間,包括算法程序、輸入的初始數據以及算法執行過程中需要的額外空間。以上兩個知識點均在高中信息技術選修教材《算法初步》中有所涉及,運用于此也可以體現該教學項目中的知識框架是由“數值計算”與“算法作用”兩大知識點聯合構造。
在設計出窮舉法的算法后,學生已經可以計算出9147485和5147480的最大公約數是5。接著,教師讓學生將兩個正整數的位數再增加一些,如增加至十位,學生就會發現代碼需要很長時間才能運行結束,甚至一直沒有結果。這樣學生就會明白窮舉法雖然能夠解決問題,但只有在數字較小的情況下才具有較好的實用性和可行性。
接著,引導學生在選擇解決問題方法這一層面優化算法,使算法的通用性更高、時間復雜度更低。這時,教師可以帶領學生回憶最大公約數的計算方法——窮舉法、短除法、分解質因數法、輾轉相除法。其中,輾轉相除法最著名,且思路較為清晰,方便學生進行編程。這個階段就可以讓學生上網搜索輾轉相除法的相關信息,并將其算法以流程圖的形式呈現。圖2是輾轉相除法的流程圖樣例,當學生完成流程圖后,先讓其分享討論,教師再點評。接著,學生根據流程圖編程,并用較大的數字進行測試,感受該算法的計算效率,同時,教師要在學生完成代碼的過程中給予幫助,圖3為參考代碼。

圖2 輾轉相除法流程圖

圖3 輾轉相除法代碼
在項目實施過程中,在將輾轉相除法轉換為Python程序代碼后,教師引導學生比較兩種算法的區別,并分別從以下指標來評價兩種算法:正確性、可讀性、健壯性、運行效率、通用性、時間復雜度。這時,教師可以在項目任務單上給出比較表格供學生探究后填寫(如右表),并在本階段給出各個指標的含義或計算方法。
正確性是指代碼可以正確輸出結果,能解決對應的問題。
可讀性是指代碼容易理解,容易編程和調試,容易維護。
健壯性是指系統在不正常輸入或不正常外部環境下仍能夠表現正常的程度,即盡可能地設計容錯機制。
運行效率是指計算相同問題時兩個代碼的時間消耗的比較,時間消耗少的運行效率高,反之則低。
通用性是指算法能否解決這一類問題中的所有情況,解決的情況越多通用性越高。
時間復雜度這一項,可以結合選修教材《算法初步》給出復雜度的計算方法,讓學生自行探索并計算兩個算法的時間復雜度。由于輾轉相除法的時間復雜度計算有一定難度,可以利用網上的視頻或者相關材料幫助學生理解。

算法特性對比表
其中,為了更直觀地比較兩種代碼在解決同一問題時的運行時間,教師可以向學生引入time庫的函數,用于記錄程序運行的時間??梢栽诖a起始處import time即引入time庫,而后在用戶輸入兩個正整數的代碼后,添加start=time.time()代碼用于記錄開始時間,在輸出公約數的代碼后添加t=time.time()-start代碼計算程序運行時間。最后,利用輸出語句把運行時間輸出,即可直觀地看出兩種算法的代碼運行時間。
在學生比較了兩種算法的各項指標后,他們會發現不同的算法區別很大,并理解解決同一個問題存在不同的算法,且算法存在有效(無效)、高效(低效)等差別。在本階段,教師可以基于以上項目目標和標準發放自評、小組互評的問卷,個性化地了解每位學生的項目實施情況以及計算思維能力的提高。
本項目融合教科版高中信息技術的“數值計算”和“算法應用”兩模塊知識點展開教學設計,提升了學生解決問題和優化解決方案的能力。在項目實踐中,自主探究和小組協作討論激發了學生主觀能動性,提升了學生的學習效率。
在高中信息技術教材中,還有很多內容適合使用項目驅動的方式來進行整合,它一方面可以將編程內容與數學等相關學科的知識點融合,另一方面也可以把不同章節的內容通過同一個項目來融合。