張霖


【摘 要】計算思維是新課程標準下信息技術課程的核心學科素養,采用“一題多解”的方式來設計教學內容,可以有效地培養計算思維、拓寬思維廣度和提高思維深度。本文以排序算法為例,設計一個“一題多解”的教學實例,以此論述基于“一題多解”思想的教學設計方法、策略和技巧。
【關鍵詞】排序算法;一題多解;計算思維;教學設計
【中圖分類號】G434? 【文獻標識碼】A
【論文編號】1671-7384(2021)010-060-03
案例背景
隨著2017版普通高中信息技術課程標準的發布,信息技術學科核心素養的理念也開始滲透到我們的課堂教學中來,為此浙江義烏市組織了一次面向計算思維培養,主題為“算法綜合復習課”的教研活動。我準備了這節《基于一題多解的算法教學設計案例》專題復習課,作為公開課與市里的老師們開展交流研討。
案例描述
課前我了解到學校里剛剛舉辦過校園藝術節,于是上課后,我借著藝術節的話題設置了如下的情境:我們班安排了若干同學參加學校的合唱比賽,比賽要求按照一定的隊形來安排隊列,隊列的要求是:男生在左,女生在右,且整個隊列從左向右看時,男生從低到高,女生從高到低。隨后我提出了這節課的第一個問題:“若知道這些同學的身高(數組a、身高數值)和性別(數組b、“M”和“W”),用什么辦法能夠編程實現隊列的排列呢?”
假設有10個學生,其身高與性別依次為:
162(女)、187(男)、155(女)、152(女)、166(男)、165(女)、177(男)、152(男)、160(女)、168(女)。
按照題目要求排成隊列后的順序為:
152(男)、166(男)、177(男)、187(男)、168(女)、165(女)、162(女)、160(女)、155(女)、152(女)。
學生很容易就想到了一個辦法:先將男生從低到高排序,再將女生從高到低排序,然后先輸出男生數組再輸出女生數組,就能夠實現了。我說:“對,那么請大家打開我們素材里的任務一,用冒泡排序算法將隊列排出來。”
“已經有幾位同學實現了,我們請實現的同學展示一下他們的結果。”我讓一位學生演示了他的作品。隨后我提高了問題的難度,提出了本節課的第二個問題:“同學們,剛才我們是寫了兩遍冒泡排序算法。那么有沒有可能只用一個冒泡算法把隊列排出來呢?”學生很明顯被這個問題難住了,我順勢給出了一個表格:“其實冒泡排序的本質就是交換,請大家看看表格(表1),思考一下哪些情況是需要將元素交換,哪些又是不用交換的呢?”
學生完成了上述的表格后,總結出了三種需要交換的情況。
情況1:兩個男生且前面的男生比后面的男生高。
情況2:前面女生且后面男生。
情況3:兩個女生且前面的女生比后面的女生低。
“好,那么請大家根據這一總結,打開我們素材里的任務二,試著完成程序填空并運行實現。”我接著說。學生在前面討論和總結的前提下,順利地完成了任務二,并且有部分學生已經開始思考后續的任務。在大部分同學完成任務二后,我又提出了這節課的第三個問題:“同學們,既然能夠用一個冒泡排序來解決這個問題,那么有沒有可能用一個選擇排序來解決呢?”由于前面問題的順利解決,這個問題學生明顯更愿意來思考和討論,有學生提到可以在選擇排序的過程中,保存下最矮男生和最矮女生的位置,并將他們交換到兩頭來實現。我就根據他們的想法在黑板上畫出了算法實現示意圖。
“第一輪的時候,我們用p來保存最矮男生的位置、q來保存最矮女生的位置,然后將他們交換到隊伍的兩頭;第二輪的時候,我們再找次矮的男女生位置,再交換到兩頭第二個位置,以此類推是不是就可以實現用一個選擇排序就排好順序了。”我總結了剛才學生的思路,也順勢提出了更深層次的問題:“但是這樣做,真的沒有問題嗎?”有學生就舉手提出了問題:“如果最矮女生的位置就在隊伍前面,那不是就會被換到最矮男生的位置上了嗎?”“對,這位同學的問題提得非常好,也說明大家開始用算法思維來考慮問題了。那么,我們應該如何解決剛才同學提出的問題呢?”學生們經過討論和思考后,提出了解決方案:當我們要換最矮的女生之前,先判斷一下她原本是否在隊頭上;若是的,則需要修正一下位置。
結合學生的討論,我又進一步分析出了這個算法還存在一個特殊情況需要處理,就是“男女生人數可能不一致,如何協調每次交換后p和q的起始位置”。解決方案也很容易被學生總結了出來:每次排完后,根據選出的結果來確定是否要讓變量p、q的起始值為+1或-1。
接下來,學生們根據剛才的討論和分析,完成了素材里面的任務三。最后,我給出了本節課最難的一個問題:“如何用索引來減少排序時交換的次數?”并且直接給出了利用索引來排序的算法實現示意圖。
由于有了前面三個問題的解決,學生對于第四個問題的思考顯然深入了很多。我們首先抽象出了一個數組p來保存所有人的序號,那么交換的時候所要比較的對象就變成了“a(q(j))”和“a(q(j+1))”,突破了這一難點后,學生很容易就完成了素材里任務四的程序填空,并調試運行加以實現。
最后,我對這節課的內容進行了總結,由“基礎冒泡的應用”→“冒泡排序本質的討論”→“選擇排序的變形”→“輔助索引數組的引入”,通過一個問題的不同解法,將排序算法中涉及到的各種算法模型進行了強化和總結。
案例反思
在本節課的教學設計中,我關注了以下4個設計要點。
1.思維難度的漸進式設計
學生對于任何內容的學習都應當遵循由易到難的原則,本文所提的4個解法就遵循了由易到難的遞進順序,先從基于基礎算法的“先分類,再排序”的思想引入解法1,再到將解題思路限制于一個冒泡/選擇排序的解法2與解法3,最后遞進到基于“索引”的解法4,算法思維深度逐級遞進,讓學生在解決問題的過程中對排序算法的理解逐步加深。
2.思維表達的具象化設計
計算思維培養的關鍵,在于如何引導學生思考并將思考的要點呈現出來。在本節課中,我采用了多種方式來表達思維過程:比如問題1,由于問題難度較低,我采用總結性的語言將算法概括了出來;而到問題2,由于情況較多,我采用表格的方式將思維要點分類并呈現;對于較難的問題3和問題4,則采用圖示的方式,利用框圖、線條、序號等符號將問題解決的抽象過程呈現了出來。
學生在這些算法呈現的基礎上,再將算法步驟歸納就容易了很多,也讓抽象的問題解決過程具象化,起到了很好的學習支架功能。
3.教學組織的多樣性設計
一節課的課堂節奏會直接影響學生的學習興趣和學習效果。本節課在“講”與“做”、“問”與“答”、“看”與“寫”等問題的解決過程中,貫穿了四次問題分析、四次解法討論和四次程序實例編寫,做到了課堂組織的張弛有度,達到了教學過程的收放自如。雖然問題難度在加深,但是由于學生在看、想、說、做等思維活動過程中的有序切換,使得學生學習時不至于太過疲勞,也有效地提升了學生對于算法學習的興趣度和參與感。
4.算法題目的有效性設計
不同難度和不同層次的算法思維,應當采用不同方式的題目設計來表現。比如本文中的解法1,由于難度較淺且使用了學生普遍掌握的算法模板來實現,教師可以采用讓學生自主完成代碼編寫并調試的方式來設計題目。又比如解法2,就比較適合采用程序填空的方式來設計題目,讓學生在透徹理解算法的基礎上,通過閱讀理解代碼來歸納算法的實現過程,進而推演分析出空白處的代碼內容。再比如解法3,由于不同過程有較大的相似性,可以采用給一個過程,讓學生構造另一個過程,整塊代碼重寫并調試的方式來設計題目。最后,如解法4這類思維深度較深的算法,不易直接讓學生構造和編寫,而應該采用部分代碼挖空的方式來設計題目,通過題目的完成情況來驗證學生對算法理解是否正確。
“一題多解”的教學設計方法可以廣泛應用于算法思維的課堂教學中,采用這種方式設計的學習內容,能夠有效培養學生構造算法模型的基本能力,在提升學生算法思維深度、拓寬算法思維廣度等方面具有明顯的作用。
作者單位:浙江義烏市教育研修院