黃 逸
算法是高中新教材新增的內(nèi)容,很多教師在處理教材過程中都遇到了困難.課程標(biāo)準(zhǔn)中指出算法思想是這一部分內(nèi)容的核心,而算法結(jié)構(gòu)與設(shè)計是對算法思想的實(shí)現(xiàn),所以也是相當(dāng)重要的一個部分.在此我想談?wù)勛约簩τ谶@部分內(nèi)容的淺見.
1 從算法思想自然地過渡到算法結(jié)構(gòu)
在算法思想這一節(jié)中,教材中介紹了各種各樣生活中的例子以及解決他們的各不相同的算法.這種現(xiàn)象雖然非常生動有趣,但卻難以揭示問題的本質(zhì).數(shù)學(xué)的主要特點(diǎn)之一就是研究事物的結(jié)構(gòu)從而揭示問題的本質(zhì).所以我們對各種算法進(jìn)行總結(jié)歸納,抽象出了三種基本結(jié)構(gòu),即順序結(jié)構(gòu)、選擇結(jié)構(gòu)和循環(huán)結(jié)構(gòu).任何一個算法都可以由這幾種結(jié)構(gòu)組合而成.這樣,為了研究各式各樣的算法,只需研究清楚這三種結(jié)構(gòu)就可以了.數(shù)學(xué)上的分類思想在這里得到了充分的體現(xiàn).
2 從整體上把握三種結(jié)構(gòu)
教材中三種結(jié)構(gòu)是順著寫下的,但我認(rèn)為在實(shí)際教學(xué)過程中首先應(yīng)該讓學(xué)生對他們有一個整體的感覺,再逐個做詳細(xì)的解說.比如為了激發(fā)學(xué)生的興趣,可以從他們感興趣的電腦游戲說起.電腦游戲都是程序編出來的,自然逃不開以上三種結(jié)構(gòu).游戲的一關(guān)一關(guān)的順序進(jìn)行就是一個順序結(jié)構(gòu);在有的游戲中需要面臨抉擇,要選擇走哪條路,這就是選擇結(jié)構(gòu);當(dāng)游戲中某關(guān)沒有闖過,又會跳到這一關(guān)的開頭,重復(fù)之前走過的路,如果很多次都闖不過去,電腦上就可能會彈出GAME OVER的字樣,這其實(shí)就是循環(huán)條件不滿足,跳出循環(huán)的表現(xiàn).通過這樣生動的例子不僅可以激發(fā)學(xué)生的興趣,而且可以讓他們對算法的三種結(jié)構(gòu)有一個感性的認(rèn)識,在進(jìn)一步理性認(rèn)識時就不會感到太抽象和吃力.
3 深刻把握三種結(jié)構(gòu)的層次
在對三種結(jié)構(gòu)做仔細(xì)分析時,要注意他們之間的自然過渡.例如對于順序結(jié)構(gòu)的教學(xué)可以通過以下例題做分析歸納,從而轉(zhuǎn)入對選擇結(jié)構(gòu)的討論.
分析 對于可以用公式解決的問題,只需把相關(guān)的變量設(shè)為一些字母并把每個數(shù)值賦給相應(yīng)的字母,再輸入公式,就可以得到答案.這個過程其實(shí)就類似使用計算器.然而,并不是所有的問題都有現(xiàn)成的公式,這時就要用到稍復(fù)雜的結(jié)構(gòu)了,計算機(jī)相對計算器的優(yōu)勢也就顯現(xiàn)了出來.
例2 判斷某年份是否為閏年,要看此年份能否被4整除.如果不能被4整除,則是平年;若能被4整除,但不能被100整除,則該年為閏年;若能被4整除,又能被100整除,還要看能否被400整除,若能則為閏年,否則也為平年.寫出判斷是否為閏年的算法.
分析 這是一類比較常見的問題,如車票費(fèi),物管費(fèi),稅收,成績等級,解一元二次方程(對Δ的討論),解不等式(對系數(shù)正負(fù)的討論)等.雖然沒有一個固定的公式,對于每種情況往往有一個相應(yīng)的結(jié)果.通常用選擇結(jié)構(gòu)來處理.重點(diǎn)在于分清各種情況,用選擇語句進(jìn)行嵌套時一定要分清層次,注意條件和結(jié)果的一一對應(yīng).本質(zhì)就是數(shù)學(xué)上的分類討論思想.但是我們發(fā)現(xiàn),以上這些問題只需要人和一個計算器就能完成,我們何必要費(fèi)盡心思寫算法讓計算機(jī)來算呢?
例3 求1-1/2+1/3-1/4+…+1/99-1/100的算法
分析 對于這個問題,僅靠人工加計算器在短時間內(nèi)難以解決,而這也是一類比較常見的問題,如有一定規(guī)律的數(shù)列的和,積.我們可以首先給出一個初始值,運(yùn)用循環(huán)結(jié)構(gòu),告訴計算機(jī)你要進(jìn)行的運(yùn)算滿足的條件,即循環(huán)條件,然后就可以把一切都交給計算機(jī)去做了.該結(jié)構(gòu)中的循環(huán)變量有兩類作用:1.控制所加到數(shù)的大?。ㄈ绫绢}中的1/100)或運(yùn)算結(jié)果大小(如要求數(shù)列運(yùn)算結(jié)果大于某個值);2.從1開始控制循環(huán)次數(shù)(如給定了數(shù)列的項(xiàng)數(shù)).此類題目往往是利用計算機(jī)運(yùn)算速度快的特點(diǎn)去解決人腦在短時間內(nèi)無法解決的問題.通常這類問題沒有明確的公式,只能“死算”.至此,計算機(jī)的優(yōu)勢才得以充分體現(xiàn).
4 體現(xiàn)數(shù)學(xué)對于算法的重要性
雖然課程標(biāo)準(zhǔn)不要求學(xué)生自己會在計算機(jī)上編程運(yùn)行,但教師還是有必要掌握這一點(diǎn).這樣可以真實(shí)地運(yùn)行一些程序讓學(xué)生感受數(shù)學(xué)對于算法的重要性.
例4 求兩個數(shù)的最大公約數(shù)
分析 一個自然的想法是從兩數(shù)中較小的那個數(shù)開始試,如果他能夠被兩數(shù)整除則為最大公約數(shù),如不能則把他減1,再試,依次類推,直到找到一個同時整除這兩數(shù)的數(shù).這種算法乍看起來挺好的,他發(fā)揮了計算機(jī)的窮舉優(yōu)勢.但是如果兩個數(shù)字都很大,計算機(jī)的運(yùn)算量就會相當(dāng)大.用窮舉法嘗試運(yùn)行一下,再用輾轉(zhuǎn)相除法寫程序運(yùn)行一下,兩者對比就會發(fā)現(xiàn)后者速度快得多.通過數(shù)學(xué)改進(jìn)的算法效率大大提高.
例5 求方程f(x)=x3+x2-1=0在[0,1]上的近似解,精確度為0.01
分析 對于這個問題,直接窮舉顯然是不可能的.因?yàn)閇0,1]是一個無限集,無法讓計算機(jī)跑遍所有的數(shù)一個一個去嘗試.所以要用二分法來解,而他的理論基礎(chǔ)是連續(xù)函數(shù)的介值性.這更進(jìn)一步說明了算法離不開數(shù)學(xué).我們知道,程序的靈魂是算法,這里我想說,算法的靈魂是數(shù)學(xué)!
此外,北師版教材主要要求學(xué)生掌握基本的算法,對好的算法沒有很高的要求,這是受課時數(shù)限制決定的,但是教師可以向?qū)W生做一個簡略的介紹,因?yàn)橹挥性诜治鏊惴ǖ男蕰r才能充分體現(xiàn)數(shù)學(xué)對于算法的重要性,也為學(xué)生日后的進(jìn)一步學(xué)習(xí)打下基礎(chǔ).
“本文中所涉及到的圖表、注解、公式等內(nèi)容請以PDF格式閱讀原文”