
算法作為穩定的信息技術/科技課程核心內容,所展現出來的思維內涵與思維能力的可測評特征非常顯著,其學習深度與廣度也一直被一線教學從各角度不斷研究,本期解碼將從浙江省高中教學一線觀察與探索算法教學如何實現生成式的計算思維培養。
摘要:本文通過對浙江省技術選考信息技術部分的深入分析,發現計算思維核心素養培育存在短板。作者通過學生訪談、教學實踐,從教師“教”與學生“學”的維度提出了多元思維碰撞形成融合思維、一題多解豐富算法思維內涵、迭代優化引領算法思維提升等教學策略,以期為一線教學提供有益的參考。
關鍵詞:算法思維;技術選考;高中信息技術
浙江省針對信息技術新課標新教材的高考技術選考已經歷三次考試。試題緊扣教材,關注學生“必備知識、關鍵能力、學科素養、核心價值”四個層面,凸顯學科育人價值,強調信息技術學科的基礎性、綜合性、應用性和創新性,從多方面促進了信息技術課程的有效教學和有效學習。
數據表征:揭示學生計算思維培養有待加強
浙江省教育考試院在每次選考之后都會發布本次選考命題解讀與答題分析,反映學生學科知識的掌握狀況、學生學科核心素養掌握狀況、學生學業質量水平掌握狀況以及試題難度分布情況。通過對浙江考試答題數據進行聚類分析,可以得到浙江省高中信息技術高考選考試卷核心素養試題分布。其中,“信息社會責任”的掌握率最高,第二是“數字化學習與創新”,第三是“信息意識”,而“計算思維”的掌握率最低。這顯示出在新課程改革中,教學從為“知識與能力”而教轉變為為“思維與素養”而教,轉換過程中存在的問題也提示,在學生計算思維培養方面的教學策略有待優化。因此,教師應針對“考情、教情、學情”的實際,加強計算思維能力培養的教學方法及策略的研究。筆者認為,提升高中信息技術學科教學品質的重要且有效的途徑是重視算法思維的培育。理由有三點:①在信息技術選考中有關算法思維、編程實踐的比重最大,超過50%;②在國際上通行的計算思維綜合測評方案中,算法思維是非常重要的評價維度之一;③信息技術(科技)課程中的“科學原理”的本質是算法,課程核心目標指向學生解決問題的能力。因此,算法思維是計算思維的核心,發展算法思維就是發展計算思維。
適應變革:指向算法思維培養的教學方式轉變
根據《普通高中信息技術課程標準(2017年版2020年修訂)》(以下簡稱“新課標”)和學科指導意見,結合高考選考的方向,筆者認為在教學中可以從以下三個維度去改變。
1.基于學科大概念進行教材二次加工
選考試題注重知識結構化、綜合性,新課標解讀也明確提出要通過大概念使知識結構化、系統化。大概念教學能夠幫助學生全面、系統地理解信息技術知識,培養自主學習、問題解決及遷移的能力。同時,大概念教學基于真實的情境,以問題鏈、任務串的形式開展,有利于激發學生的學習興趣和創新精神。
例1:開發班級積分系統。
學習情境:利用所學知識開發一個班級積分系統。班級積分主要包括:學習加減分,進步和退步都按班級規則計分;紀律加減分,表揚和違紀都要按班級規定相應加減分;班級宣傳和文體活動獲獎都可以加分;值日衛生結果的加減分;做好人好事加分等。
在項目實施過程中,需要精心規劃每個組成部分的評分機制與數據存儲方式。審慎選擇使用列表還是鏈表結構來存儲數據,以及在完成數據統計后,應選用列表還是字典來匯總信息。還需制訂明確的策略,以處理班級學生個人統計的總分,并實現積分查詢等功能,確保整個流程的科學性、嚴謹性和高效性。
2.多元思維碰撞,形成融合思維認知
學生在構建算法模型前,易把問題想得很簡單,這時應將學生的邏輯思維、歸納思維及其他認知思維進行拓展和碰撞,形成思維融合的理解通道。
例2:開發班級積分系統投票功能。
學習情境:班級積分系統需要用到投票功能,每當學校要評選十佳孝星、自律之星、禮儀之星時,班級學生都需要通過投票確定人選。
(1)學生的融合思維認知。為了更好地實現融合思維,可先讓學生根據感知、體驗、判斷與推理等方式,介紹自己認知思路,再經過應用邏輯思維、歸思維進行整理。例如,班級學生大致形成兩種思路:
生1:每位同學在每張投票紙上寫10位同學的名字,然后統計出來。
生2:給班級48位同學設定2個值(1或0),1表示同意,0表示不同意,然后輸入電腦自動統計。
(2)構建不同的算法模型。為了讓學生的思路可以通過程序實現,學生建立自己的算法模型:為了輸入方便,每個學生都用自己在班級的序號替代名字。因此,有的學生建議產生10個隨機數即可。
生1:s1=[random.randint(1,48)for i in range(10)]
學生運行后發現會產生重復的數據。
生2:s2=[random.randint(0,1)for i in range(48)]
學生運行后發現被投票的學生超過了10位。
教師把這兩個問題繼續拋給學生,讓學生尋找解決的辦法。
生1:模型只要產生不重復的隨機數就可以實現了。實現思想:沒出現過的序號加入列表,如果出現過,再隨機產生不重復新序號,直到產生相應的個數。
生2:每次隨機產生0和1,按順序加入列表,當列表中1的個數達到10個就結束程序。
程序運行后發現后面序號的學生基本都是0,也就是產生了10個1以后,后面的序號都不考慮了,這樣對后面的學生不公平。有學生補充到,應用生1的想法,先得到10個不同的序號,然后再把這些位置上的值設置成1,其他位置的值設置成0。
(3)迭代、優化算法,提升運行效率。以上的算法都涉及10個不重復的隨機數。要產生10個不重復的隨機數,需要產生的次數大于10次。
經過學生的思想碰撞后,覺得有兩種算法可行:
第1種:先隨機抽取序列里一個位置的數,然后把這個位置的數用最后一個位置的數替代,縮小產生隨機數序列范圍-1,這樣,后面產生的隨機數都不會重復,依次類推。
第2種:先隨機抽取序列里面一個位置的數,然后把這個位置的數用列表的pop()函數彈出去,接下來在剩下的序列里面繼續抽取一個位置的數,仍然把這個位置的數用列表的pop()函數彈出去,直到抽到相應的個數。
(4)一題多解,豐富算法思維的內涵。從浙江考試反饋的3次選考試題算法壓軸題得分可以看出,區分度非常大,對學生的思維要求很高。怎樣重塑學生學科信心,培養學生的算法思維?一題多解是一個有效的途徑。下面以約瑟夫問題為例,讓學生用列表、鏈表、隊列等分別去實現。
用列表解決的思路:先按列表順序開始報數,報到第key個人,讓這個列表元素的值置為0,接下來又從1開始報數,報到第key個人,讓這個元素的值置為0,如果再報數到最后一個,從頭開始,但計數的必須是值不為0的,以此類推,直到最后剩下1個不是0的元素,輸出結果。在這個問題解決過程中,學生提出質疑:當列表中0元素增加時出列效率將越來越低,能否用pop()的方法來實現元素真實出列?
用鏈表實現出列:首先要構建一個循環鏈表,然后遍歷鏈表,根據遍歷計數,把剛好計數到key時的鏈表數據項刪除,最后留下的就是所求結果。用鏈表建立的算法比較抽象,一開始怎么用語言描述學生難以理解,而通過圖形與代碼結合的方式學生可以逐步理解。
用隊列方法解決的思路:所有人先排成一個隊列,從1開始報數,對于計數不是key的數據項讓其出隊后又入隊,對于計數到key的數據項讓其出隊,當最后隊列元素只有1個時,輸出結果。
隊列思想比較簡單,但不少學生對在什么時候需要出隊,什么時候出隊又入隊分不清楚,那么,可以借助模擬算法的過程來加深理解。
通過引導學生從不同角度、不同方法去解決問題,既可以加深學生對該問題的理解,又可以培養其邏輯思維能力和創新思維能力,從而不斷提高學生的算法思維。
以生為本:指向算法思維培養的學習方式轉變
通過訪談,筆者發現多數學生在考試時間分配上有問題,導致最后的大題來不及做。其主要原因是學生看不懂大段代碼,這是因為在平時的學習中學生沒有養成良好的程序閱讀習慣和思維歸納整理習慣。下面,筆者通過部分案例介紹學生習得算法思維的方式。
1.先分后裝,以模塊突破整體項目
選考試題第15題設定了一個由n個單位(編號從1至n)參與的特定活動場景,旨在通過小組劃分的方式,綜合評估學生對程序的理解和分析能力。通過模塊化形式,引導學生逐步深入掌握項目的實踐流程,直至完整實現。這個例子給了學生很好的借鑒,在學習中要把項目分解成很多子項目,并結合教材相應的內容不斷去實現。例如,班級積分系統某個方面的計分,就可以讓學生寫成自定義函數,并標記該函數的功能,在最后的主程序中調用該函數就可以。當學生讀取數據后,調用相應的自定義函數,把數據的流轉厘清,最后的項目就會慢慢實現。在考試時,學生可以先分析試題考查什么知識點,與所學的知識有沒有類似,可以從哪個角度去思考這類題目,由此不斷總結提升自己的思維。
2.思維碰撞,拓展思維廣度和深度
在班級積分系統中,對于實現某個功能,不同的學生會有不同的想法,教師要充分調動學生的思維,不斷拓展思維空間。例如,要在班級積分系統中根據統計取出前n位高票學生:
生1:把所有同學的得票結果加入一個列表,按降序排序,把索引是n-1位置的設置為key,最后把原始數據大于等于這個值的序號和選票結果輸出。
生2:將每個同學的選票結果復制到一個新列表tmp,取出tmp中的元素最大值,用列表pop()的方法彈出去,對剩下的列表元素依次處理,直到彈到第n個……
生3:將每個同學的選票結果先復制一個新列表tmp,再對tmp中的每個數據項的值都減1,統計有幾個數大于0,如果個數超過n,則進行下一輪重復操作,直到tmp列表中數據項值大于0的個數小于n個,則輸出所有大于等于0位置。
在這幾位學生的啟發下,其他學生開始選擇自己可以理解的方法嘗試編寫程序。在自己的摸索和同學互助下,絕大多數學生都能實現。這時,課堂可以放慢節奏,讓學生再嘗試另外兩種方法,并且領悟幾種方法的異同。
生:在生3的想法中,如果選票數量特別大,效率不高,能否提升效率?
有的學生還提出每次減去列表中最小值,或者減去列表中最大值和最小值的中間值,或者其他……這些都可以留給學生自己去編程驗證。
3.歸納總結,提升形式化遷移能力
在計算機科學中,任何問題最終都被分治為二進制運算。特別是在遇到只有兩種可能性的問題時,利用二進制的思想來求解是一種高效且直觀的方法。在學生學習了枚舉算法和進制轉換的基本思想后,筆者給學生留下了一個著名的歷史問題——李白買酒(如上圖)。
關聯:一開始學生用數學列方程的方法求解。教師提問:“如果用編程的思想,同學們怎么解決呢?”學生一開始找不到解決的辦法,但經過提醒,把酒店和賞花看成兩種不同的狀態,那么這個問題就和以前學過的二進制知識關聯了,把酒店看成1,把賞花看成0,如果遇到1,則變量的結果乘以2,如果遇到0,則變量的結果變成原來的變量減1。這個問題就可以看成“101010”求解原始變量問題。
遷移:把這個問題修改一下,如果不是到店馬上又賞花,只告訴你店和花一共有10個位置,李白的酒壺中酒由你輸入,經過10個位置剛好喝光壺中酒,店和花順序有多少種可能呢?這時學生可能會一個個去列舉,把所有的可能都列出來。但有的學生會遷移二進制的思想,把10位二進制所有可能一一驗算,如果剛好喝完,就輸出這種可能的店和花順序結果。
提升:在處理生活中的問題時,有很多都跟時間有關。有的需要把時間轉換成秒,也有的輸出結果需要把秒轉成“時∶分∶秒”,其實這本質上都是進制轉換問題(60進制轉10進制)。因此,可以歸類整理進制思想解決的問題情境,以備更好地遷移。
學習的過程是一個持續積累知識,并將所學知識應用于實際問題的過程。學生只有自覺地進行歸納總結,不斷地將所學知識進行應用、遷移,才能提升學習能力,個人素養才能得到發展。
參考文獻:
[1]中華人民共和國教育部.普通高中課程方案(2017年版2020年修訂)[S].北京:人民教育出版社,2020.
[2]中華人民共和國教育部.國務院辦公廳關于新時代推進普通高中育人方式改革的指導意見[EB/OL].https://www.gov.cn/zhengce/zhengceku/2019-06/19/content_5401568.htm.
[3]任友群,黃榮懷.《普通高中信息技術課程標準(2017年版2020年修訂)》解讀[M].北京:高等教育出版社,2020.