邊楚女
浙江省新高考實施“7選3”模式后,技術成為其中的一門選考科目。“算法與程序設計”作為選考的考試內容,難度和廣度有所提升,解析、枚舉、排序、查找、遞歸等經典算法變成教學重點。同行們在教學研討時常會提出一些問題:在學習這些經典算法時,如何讓學生真正有效經歷分析問題、確定算法、編程求解等計算機解決問題的基本過程,形成科學穩定的知識邏輯結構?是留白程序填空還是讓學生自己獨立編程?如何通過這些經典算法培養學生解決實際問題的能力?
2006年高中新課程改革之初,筆者學校就開設了“算法與程序設計”課程,當時也有教學這些經典算法,但由于那時要求不高,教學中教師的引導和指導較多,學生很多時候是靠填空程序來理解的。現在,在深化課程改革思想的推動下,課堂的教學模式和理念有了變革性的變化,以“學為中心”的課堂正逐漸成為新常態,所以,對這些經典算法的教授也應該進一步改進。
2007年,筆者曾在天津參加全國優質課展評活動,課題是“對分查找”。在那時這一課的設計和實施得到較廣泛的認同,但現在回頭來看,這節課的設計和教學有很多需要改進和提升的地方。前段時間,在給選考班上課時,我在原來設計的基礎上對《對分查找》這一課作了改進,分成《對分查找算法實現》和《對分查找算法應用》兩個課時,現以第一課時《對分查找算法實現》為例來解構我對這節課的設計和實施,以期拋磚引玉,與同行們一起努力建構更好的經典算法教學模式。我設定這一課時的主要教學目標為:理解對分查找的原理,通過分步解析各種查找情況,歸納對分查找的基本思想和方法,確定解題步驟,并最終獨立完成程序編寫。
課堂教學
1.設問引入對分查找算法
上課伊始,我問學生:“有一個數在1~100之間,請大家用最少的次數來猜出這個數。你會先猜幾?”學生回答:“50。”“好,這個數在1到49之間,你會猜幾?”“25。”“為什么你們最初會猜50,接下來猜25呢?”隨后我再扔出一個問題:如果我告訴你這個數是15,按照剛才的邏輯,幾次可以猜到這個數呢?與學生交流后,我說:“在剛才的溝通中,其實隱藏著一個非常經典的算法——對分查找。同學們應該能感覺到這種算法的存在,但它究竟是怎樣的呢?”
教學闡析:原來設計課堂導入時,我會展示一件物品,讓一個學生來猜這個物品的價格,其他學生根據這個學生猜出的價格提示“高了”或是“低了”。如果學生能在約定次數內猜對這個物品的價格,我就把這件物品“贈送”給他。為了節約教學成本,更快地切入正題,現在的我換了一種導入模式,爭取在兩三分鐘內引入對分查找,同時讓學生從互動討論中預熱對分查找的思想。
2.明確對分查找實施原理
在剛才溝通的基礎上,我們先來明確對分查找實施原理:
(1)對分查找是效率很高的查找方法,但被查找的數據必須是有序的。
(2)首先將查找的數與有序數組內處于中間位置的數據比較,如果中間位置上的數與查找的數不同,根據有序性,就可確定應該在數組的前半部分還是后半部分繼續查找。
(3)在新確定的范圍內,繼續按上述方法進行查找,直到獲得最終結果。
教學闡析:這個環節,我直接告訴學生對分查找實施原理,讓學生建構一個清晰的問題結構,以便正確導航接下來的學習。
3.分解查找過程中可能出現的第一種情況
明確了對分查找的實施原理,如何編出對分查找的程序呢?現以規模為10的升序數組d為例加以分析:用數組d(1 to 10)存放數據序列,用i表示查找范圍的第一個數組元素下標,j表示最后一個數組元素下標,mid表示數組中間位置元素下標。
假如查找鍵key=48(如圖1),學生經歷的思考過程如下:
第一次查找:范圍為d(1)~ d(10),i=1,j=10,mid=int((1+10)\ 2)=5,d(mid)=d(5)=22,key=48,d(mid) 第二次查找:新的數據查找范圍為d(6)~d(10),mid=int((6+ 10)\2)=8,d(mid)=d(8)=45,key= 48,d(mid) 第三次查找:新的數據查找范圍為d(9)~d(10),mid=int((9+ 10)\2)=9,d(mid)=48,key=48,d(mid)=key,找到啦!查找結束! 在以上的分析過程中,我引導學生思考兩個問題:①d(mid) 總結:如果d(mid) 教學闡析:我與學生共同完成第一種情況的分析,并通過兩個思考題引導學生聚焦于問題的解決。有了這一過程,學生在接下來的獨立分析環節就能把握方向。 4.分解查找過程中可能出現的第二種情況
假設查找鍵key=17(如圖2),讓學生在Excel中畫出相應的查找示意圖,并思考:當d(mid)>key時,新查找的范圍在哪里?i和j如何變化?學生經歷的思考過程如下:
第一次查找:范圍為d(1)~ d(10),i=1,j=10,mid=int((1+ 10)\2)=5,d(mid)=d(5)=22,key= 17,d(mid)>key,確定接下來要找的范圍是數據序列的前半部分。
第二次查找:新的數據查找范圍為d(1)~d(4),mid=int ((1+3)\2)=2,d(mid)=d(2)=15,key=17,d(mid) 第三次查找:新的數據查找范圍為d(3)~d(4),mid=int((3+ 4)\2)=3,d(mid)=d(3)=17,key=17,d(mid)=key,找到啦!查找結束! 總結:如果d(mid)>key,新查找范圍為上半部分,i值不變,j=mid-1。 教學闡析:學生模仿第一種情況,自主經歷問題的分析過程,厘清第二種查找情況的原理,得出i、j的變化規律。有了第一種情況的“導”,學生對第二種情況的“學”就能更有效,這樣既發揮了教師導的作用,又培養了學生自主學習的能力。 5.分解查找過程中可能出現的第三種情況 假設查找鍵key=20(如圖3),讓學生在Excel中繼續畫出相應的查找示意圖,并思考:在什么情況下查找會結束?繼續進行重復查找的條件是什么? 學生經歷的思考過程如下: 第一次查找:范圍為d(1)~ d(10),i=1,j=10,mid=int((1+ 10)\2)=5,d(mid)=d(5)=22,key= 20,d(mid)>key,確定接下來要找的范圍是數據序列的前半部分。 第二次查找:新的數據查找范圍為d(1)~d(4),mid=int((1+3)\2)=2,d(mid)=d(2)=15,key=20,d(mid) 第三次查找:新的數據查找范圍為d(3)~d(4),mid=int((3+ 4)\2)=3,d(mid)=d(3)=17,key=20,d(mid) 第四次查找:新的數據查找范圍只有d(4),mid=int((4+4)\2)=4,d(mid)=d(4)=18,key=20,d(mid)≠key,最后只剩一個數據時,還是找不到,說明數據不在這個序列里,查找結束。 總結:①找到了查找會結束。②在i<=j時重復查找,如果還是找不到,查找也會結束。 教學闡析:在教師的宏觀把握下,學生通過對漸次遞進的三種情況的分析,主動把握住了對分查找實施的具體過程。同時,教師要明確的是,除了要總結出i、j的變化規律,什么時候查找會結束也是這節課的重難點。因此,讓學生思考查找結束的情況也應該在分析問題的過程中及時介入,這樣在接下來編寫循環結構的判斷條件時,學生的思考就有了落腳點。 6.對各種情況進行歸納總結 通過以上三種情況的分析,我們可以歸納如下: (1)key與d(mid)的大小比較影響i、j取值的規律: i的取值規律:如果d(mid) j的取值規律:如果d(mid)>key,那么j=mid-1。 (2)繼續進行重復查找的條件:i≤j。 教學闡析:雖然前面分步提到了這些信息,但是課堂中很有必要整合這些結論,讓學生從宏觀上形成一個完整的知識結構。當然,教師不要一下子呈現這一知識結構,要引導學生自己表達。 7.用流程圖來描述對分查找算法 教學闡析:教師不要一下子全部展示這個流程圖(如圖4),而應逐漸展開,在關鍵點上留白讓學生口頭填空。 8.對分查找算法程序實現 接下來,為了讓學生聚焦到學習重點,我事先設計好了程序界面窗體,并生成了100個升序數據,學生的中心任務就是全心全意完成對分查找程序(如下頁圖5)。經過編寫、調試、思考、改進和教師旁白引導、個別指導,絕大部分學生在20分鐘內都能編寫出完整的對分查找程序。 教學闡析:通過前面的鋪墊分析,學生形成了清晰的問題解決邏輯結構,再加上一段時間學習養成的良好編程基本功,學生最終獨立編寫出了程序。以前由于擔心學生沒法完成這個任務,所以采用留白填空的方法。實踐證明,如果教師有較好的教學規劃,有培養學生自主學習和獨立思考的意識,學生肯定能一次一次地堅實成長。 9.提升、鞏固和總結 完成的學生把升序序列改成降序序列后再改動對分查找程序,同時研究對分查找最多的查找次數,最后通過幾個選擇題加以鞏固。如果有時間,教師可以適當提升對分查找算法的實際意義:設想一下在一個有一百萬個人名的電話簿中找一個名字,對分查找可以讓你不超過21次就能找到指定的名字。如果你將世界上所有的人按照姓名排序,那么你在35次以內就能找到任何人。對分查找的實際應用價值還有哪些呢?下節課待續! 教學闡析:為了讓學生充分內化對分查找算法,第二課時《對分查找算法應用》通過對分查找在求解高次方程實根等多個具體問題中的運用進一步鞏固對分查找知識。 課堂綜述 這節課沒有先聲奪人的情境鋪墊,沒有氣氛熱烈的小組合作,沒有滔滔不絕的教師講解,更多的是教師嚴密理性的引導和學生被激活的思考和實踐。為了給學生充分的思考和實踐,每個環節都不容拖沓,每個點都需無縫對接,這就需要教師精心備課,去除冗余語言,精心準備各個資源,把時間擠出來給學生自主學習。例如,在原來的教學設計中,學生是在紙上畫數據序列變化情況,現在我讓學生在Excel中進行研究,并事先輸好數組元素和數據初始序列;在學生編程環節,窗體和數據序列都已經給學生準備好,學生只需把精力投入到對分查找的主體程序上。這樣做的目的是讓學生充分聚焦到學習重點上,讓時間有限的一節課變得更有效,實現教學目標的最大化達成。當然,這些都是課堂背后的故事;上課時,教師則不要為了趕時間而語焉不清,不要為了趕進程而壓縮需要充分思考的時間。特別是在編程實踐部分,教師更需要讓學生靜下心來,在一個松弛的環境中研究,而不要在旁邊說話“影響”學生,如“時間不多了,大家快一點”“有些同學已經完成任務了,沒完成的同學抓緊時間”等。 觀點總結 教雖無定法,但在經典算法教學時,我建議教師們把握這樣的指導思想:減少形式主義的情境堆砌和華麗鋪墊,多些實實在在的學習指導;教師切忌講太多,要想方設法讓學生真正親歷解決問題的全過程。教師在算法形成過程中可以引導學生,但在編程環節最好讓學生獨立編程。如果學生基礎整體較弱,可以留白給學生填空,但是前面的分析過程還是要讓其參與進來,而不是直接告訴他們“是什么”,應與他們一起走過“這是怎么來的”學習過程;如果學生基礎較好,可以減少教師引導的部分,給學生更多自主思考和編程的時間。另外,教師備課時一定要建構清晰的知識結構,再通過配套的實際應用課,來提升學生用經典算法解決實際問題的能力。更重要的是,在“算法與程序設計”的基礎學習階段,教師要夯實學生的編程規范和基本功,一開始就讓其養成獨立編程的習慣,這樣學生才能形成后續學習的良性循環。 經典算法課怎么上?一言以蔽之:摒棄形式主義,讓思考、學習和實踐真實地在課堂中發生!