徐暢++楊莉
摘要:算法是程序的靈魂,本文結(jié)合教學(xué)實(shí)踐,提出了三點(diǎn)改進(jìn)和加強(qiáng)學(xué)生算法設(shè)計(jì)技能的做法,有效地提升了學(xué)生的算法分析與設(shè)計(jì)能力,以及編程能力。
關(guān)鍵詞:高職學(xué)生;算法設(shè)計(jì);技能訓(xùn)練
中圖分類號(hào):G710 文獻(xiàn)識(shí)別碼:A 文章編號(hào):1001-828X(2016)025-000-01
著名的計(jì)算機(jī)科學(xué)家N.Wirth曾經(jīng)提出過(guò)這樣一個(gè)公式:程序=數(shù)據(jù)結(jié)構(gòu)+算法[1]。其中數(shù)據(jù)結(jié)構(gòu)指的是數(shù)據(jù)與數(shù)據(jù)之間的邏輯關(guān)系;而算法指的是解決特定問(wèn)題的步驟和方法。在一個(gè)程序當(dāng)中,算法是整個(gè)程序的靈魂,數(shù)據(jù)結(jié)構(gòu)是加工對(duì)象,而語(yǔ)言只是實(shí)現(xiàn)的工具。由此可見(jiàn),算法在整個(gè)程序設(shè)計(jì)當(dāng)中有著非常重要的地位。因此,教師在教學(xué)中,不能夠僅僅只滿足于讓學(xué)生掌握好程序設(shè)計(jì)語(yǔ)言的基礎(chǔ),更關(guān)鍵的是要培養(yǎng)學(xué)生的計(jì)算思維,加強(qiáng)學(xué)生的算法設(shè)計(jì)能力,以及利用計(jì)算機(jī)處理和解決問(wèn)題的能力。筆者長(zhǎng)期從事程序設(shè)計(jì)類課程的教學(xué)和研究,下面就來(lái)談一談在程序設(shè)計(jì)教學(xué)中如何改進(jìn)和加強(qiáng)學(xué)生算法設(shè)計(jì)技能的幾點(diǎn)做法與體會(huì)。
一、利用閱讀填空法來(lái)訓(xùn)練學(xué)生的算法設(shè)計(jì)技能,鍛煉學(xué)生閱讀算法的能力
目前,在教學(xué)過(guò)程中有關(guān)算法設(shè)計(jì)技能的訓(xùn)練方法仍然普遍采用的是非常傳統(tǒng)的方法。即老師向?qū)W生布置算法設(shè)計(jì)作業(yè),而學(xué)生根據(jù)作業(yè)題目的要求來(lái)設(shè)計(jì)算法,然后將算法用程序?qū)崿F(xiàn),并上機(jī)調(diào)試驗(yàn)證。這種傳統(tǒng)方法的優(yōu)點(diǎn)是可以充分地發(fā)揮學(xué)生在算法設(shè)計(jì)方面的主觀能動(dòng)性;但缺點(diǎn)是一旦學(xué)生遇到稍復(fù)雜一些的題目,算法設(shè)計(jì)難度較大,就會(huì)感到無(wú)從下手。而如果將這種傳統(tǒng)的讓學(xué)生把算法從頭寫(xiě)到尾的訓(xùn)練方法,轉(zhuǎn)變?yōu)樗惴ㄩ喿x填空法,就可以彌補(bǔ)傳統(tǒng)訓(xùn)練方法的不足。閱讀填空法是將編寫(xiě)好的算法去掉若干語(yǔ)句或表達(dá)式,然后配上必要的一些算法說(shuō)明,讓學(xué)生在閱讀過(guò)程中將這些空白填起的一種啟發(fā)式的訓(xùn)練方法。實(shí)踐證明,在學(xué)習(xí)的初、中期階段,利用閱讀填空法來(lái)訓(xùn)練學(xué)生的算法設(shè)計(jì)技能,既可以鍛煉學(xué)生閱讀算法的能力,又可以讓學(xué)生在閱讀的過(guò)程中體會(huì)算法設(shè)計(jì)的嚴(yán)密性和周全性,使學(xué)生形成良好的程序設(shè)計(jì)風(fēng)格。
二、在訓(xùn)練算法設(shè)計(jì)能力時(shí),要找到算法之間的相通點(diǎn),提取共性,學(xué)會(huì)對(duì)算法進(jìn)行歸納和總結(jié)
在程序設(shè)計(jì)的教學(xué)中會(huì)需要學(xué)生掌握許多的算法,每一種算法都有適合它使用的范圍;雖然每種算法都是在特定條件下所提出的,但我們發(fā)現(xiàn)某些算法之間也仍然會(huì)存在有一些相通點(diǎn)。如果在介紹算法時(shí),教師能夠從這些共性上出發(fā),將更有利于學(xué)生對(duì)相關(guān)知識(shí)的理解和掌握,提高他們的學(xué)習(xí)效率[2]。
例如,有序表中的數(shù)據(jù)查找,就可以采用折半查找、斐波那契查找、插值查找等多種查找方法來(lái)提高查找的效率。這些查找方法雖然在實(shí)現(xiàn)的過(guò)程中有所不同,但其算法思想是相通的,在學(xué)習(xí)的過(guò)程中就可以對(duì)它們進(jìn)行歸納。
設(shè)某有序表的查找范圍是[L,H],在L到H的范圍內(nèi)找一個(gè)點(diǎn)t,則[L,H]被分成了三個(gè)區(qū)間:[L,t-1]、t、[t+1,H],而要查找的數(shù)據(jù)必定存在在其中的某一個(gè)區(qū)間里。當(dāng)點(diǎn)t等于要查找的數(shù)據(jù)時(shí),則查找成功;否則縮小查找范圍,在[L,t-1]或[t+1,H]中進(jìn)行下一步的查找。如果對(duì)于點(diǎn)t采用不同的設(shè)置方法,就會(huì)得到不同的查找方法:(1)當(dāng)將點(diǎn)t設(shè)置為區(qū)間的中點(diǎn)時(shí),就是折半查找;(2)當(dāng)將點(diǎn)t設(shè)置為區(qū)間的黃金分割點(diǎn)(斐波那契)時(shí),對(duì)應(yīng)的就是斐波那契查找;(3)當(dāng)將點(diǎn)t設(shè)置為線性插值的分點(diǎn)時(shí),就是插值查找;(4)當(dāng)點(diǎn)t是區(qū)間里的隨機(jī)點(diǎn)時(shí),則對(duì)應(yīng)的就是隨機(jī)查找。如果將點(diǎn)t的選取用一個(gè)函數(shù)來(lái)表示,則上述這些查找算法從總體上來(lái)看都是基本相同的??梢岳肅語(yǔ)言統(tǒng)一描述為:
int Search(STable T,KType k)
{ int H, L,t;
H=ST.length-1;
L=0;
while(H>=L)
{ t=tpoint(L,H);
//tpoint()為點(diǎn)t的選取函數(shù),不同的查找方法實(shí)現(xiàn)是不同的
if (EQ(k,T.elem[mid].k)) return(t);
else if(LT(k,T.elem[mid].k)) H=t-1;
else L=t+1;
}
return(-1);
}
三、從多角度去思考,對(duì)同一問(wèn)題讓學(xué)生尋找不同的算法去解決,從而培養(yǎng)學(xué)生的發(fā)散性思維,提高創(chuàng)新能力
在算法設(shè)計(jì)時(shí),不但要求能夠針對(duì)問(wèn)題設(shè)計(jì)出一種正確的算法,還要追求算法的結(jié)構(gòu)合理、可讀性強(qiáng)和時(shí)空效率高等更高目標(biāo)。因此,通過(guò)對(duì)學(xué)生的算法設(shè)計(jì)技能進(jìn)行培訓(xùn),能夠培養(yǎng)他們的創(chuàng)造性的思維,提升其創(chuàng)新能力。對(duì)于一個(gè)問(wèn)題,不僅僅只滿足于找到一種解決的方法,而是要求學(xué)生能夠從多方面、多角度地去思考,找出不同的解決方法,用不同的算法去實(shí)現(xiàn),這樣可以更加有效地開(kāi)拓學(xué)生的思維。在這一過(guò)程中,通過(guò)對(duì)不同算法進(jìn)行比較,也可以讓學(xué)生發(fā)現(xiàn)和總結(jié)這些算法的特點(diǎn)。
例如,在數(shù)組A中存放有n個(gè)整數(shù)(從A[1]開(kāi)始存放,A[0]未用),請(qǐng)?jiān)O(shè)計(jì)一個(gè)算法來(lái)判斷數(shù)組A中是否存在相同的元素。
算法1,將數(shù)組A中的每一個(gè)數(shù)組元素A[i](1≤i 算法2,首先將數(shù)組A進(jìn)行排序,如果數(shù)組A中存在相同數(shù)組元素,則排序后相同元素一定相鄰;然后將數(shù)組A中相鄰數(shù)組元素進(jìn)行比較,即比較A[i]與A[i+1](1≤i 參考文獻(xiàn): [1]譚浩強(qiáng).C語(yǔ)言程序設(shè)計(jì)[M].北京:清華大學(xué)出版社,2000. [2]董永生,鄭林濤.算法設(shè)計(jì)與分析課程教學(xué)的探討[J].信息與電腦(理論版),2015(08) 作者簡(jiǎn)介:徐 暢(1982-),女,漢族,湖南長(zhǎng)沙人,湖南安全技術(shù)職業(yè)學(xué)院講師,研究方向:程序設(shè)計(jì)和計(jì)算機(jī)技術(shù)。
現(xiàn)代經(jīng)濟(jì)信息2016年25期