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