摘 要:本文通過對幾個算法案例的分析,闡述算法教學中應該要注意的幾個問題,從而更好地理解算法的意義及其本質.
關鍵詞:算法含義;選擇結構;循環結構
高中教材引進算法內容已經四個年頭了. 縱觀近幾年的高考試題,基本上都是只考一道選擇題或填充題. 因此許多教師都錯誤地認為算法的教學可以簡單些,只需要教給學生一個簡單的思路就可以了,從而對教材的內容研究不到位,以致于面對學生提出的一些問題解釋不清,教師和學生就這么稀里糊涂地學過去了. 其實,引進算法的必要性在于教給學生認識問題、解決問題的思想方法. 試想如果連知識的內涵都沒搞清楚,那么即便能做出一道高考題,那又有多大的意義呢?本文試擷取筆者在教學中遇到的幾個問題,談談其認識以及處理方法.?搖
對算法含義的理解
教材(蘇教版,下同)中關于算法的含義是:對一類問題的機械的、統一的求解方法. 該定義中“一類”應該怎么理解呢?“求解方法”又該怎么理解呢?
案例1 已知數字序列2,5,7,8,15,32,18,12,52,8,寫出從該序列搜索18的一個算法.
這是一次作業中的一道題目. 作業交上來后,一個學生是這樣寫的:輸出18.
上課時,筆者問這個學生你為什么這樣寫,他說我直接看出來的,故我就這樣寫了. 筆者接著問:假如有很多個數,而且這很多個數中有不止一個“18”這樣的數,那你還能一眼看出來嗎?這個學生一時語塞.
實際上,出現這種情況還是歸結到如何理解算法的定義的問題. 在此情況下,我們必須尋找一個“機械的、統一的”的解決方法,這個方法能讓我們按既定的方法,逐一把“18”這樣的數找出來. 顯然運用觀察的方法,雖可行但超過了合理的限度,因而不再是個有效的算法了.
下面的算法就可以把從任意給定的一些數中把數“18”找出來.
S1 輸入實數a;S2 若a=18,則轉S3;否則轉S1;
S3 輸出a=18.
案例2 寫出求3,5,7,11,15的平均值的一個算法.
有學生是這樣寫的:
S1 m=;S2 輸出m.
還有學生是這樣寫的:
S1 輸入a,b,c,d,e;S2 m=;S3 輸出m.
應該說這兩種寫法均正確. 第一種算法是針對某一個具體問題而設計的,而第二種算法的設計更具備一般性,真正體現了算法是針對“一類問題的求解”的方法.
對選擇結構的理解
選擇結構是指先根據條件作出判斷,再決定執行哪一種操作的結構. 如圖1所示,虛線框內是一個選擇結構,它包含一個判斷框,當條件p成立(或稱為“真”)時執行A,否則執行B.
從選擇結構的形式可以看出:無論條件p是否成立,都只能執行A框或B框之一,不可能既執行A框又執行B框,也不可能兩個框的內容都不執行. 無論走哪一條路徑,在執行完A或B之后,脫離本選擇結構. A或B兩個框中,可以有一個是空的,即不執行任何操作.
案例3 寫出判斷函數f(x)=奇偶性的一個算法.
筆者在教學的時候畫出了如下的流程圖(圖2),寫出后讓大家進行討論.
經過一番討論后,形成了兩種意見. 一是在得出f(x)的定義域為R或關于原點對稱后,由于f(-x)與f(x)的關系可能有f(-x)= ±f(x)或f(-x)≠±f(x),因此需要三重選擇結構的嵌套. 更一般地,對函數y=f(x)的奇偶性的判斷更需要四重選擇結構的嵌套.二是對于函數f(x)=,由于其奇偶性只有一種,f(x)是奇函數,因此只需要輸出“f(x)是奇函數”就可以,是否需要輸出“f(x)不是奇函數”這樣的結果無關緊要.
應該說這兩種意見都正確,只不過就本題而言,后一種意見更簡潔、更直接.
一般情況下,對任意一個對象進行判斷,只有兩個結果:“是”或“不是”. 但有時我們只需關心其中的一個結果,而對另一個結果不加注意,這就是第二種意見所體現的意圖,這也就不難理解選擇結構中B框為什么可以是空的了,同時這也有助于理解基本算法語句中的“行IF語句”了.
對循環結構的準確把握
循環結構有兩種常見的結構,即直到型循環和當型循環(圖3).
1. 循環結構中判斷條件p是否成立
在循環背景下,如何判定給定的條件p是否成立呢?在教學中,為了突破這個問題,筆者設計了這樣的案例.
案例4 問題1:等差數列{an}中,a1=22,公差d=-2,那么數列{an}中從第幾項開始每一項都小于0?
問題拋出后,很多學生都這樣求解:數列{an}的通項公式an=24-2n,令an<0,即24-2n<0,n>12,故數列{an}從第13項開始每一項都小于0.
應該說結論是正確的,那么是否也可以說成是從第14(或15等)項開始每一項都小于0呢?這里涉及對問題的準確理解和定位. 不難看出數列{an}是遞減數列,本問題的實質是需要確定從哪一項(且只能是從這一項)開始每一項都小于0,因此應考慮建立不等式組an≥0an+1<0 來確定.由24-2n≥024-2(n+1)<0 得n≤12n>11 ,n=12,故數列{an}從第13項開始每一項都小于0.
問題2 按下列流程圖(圖4)運算:
規定:程序運行到“判斷結果是否大于244”為1次運算. 若x=5,則運算進行____次才停止;若運算進行k(k∈N*)次才停止,則x的取值范圍是________.
學生很快得到當x=5時,由于5×3-2=13,13×3-2=37,37×3-2=109,109×3-2=325>244,故只需要運行4次即停止.
對于第二個問題,由于有問題1的鋪墊,學生也很快得出下面的解法.
由于運算進行k(k∈N*)次停止,因此若k=1,則3x-2>244,x>82;當k≥2時,第k-1次時仍然不滿足條件,故有3k-1x-2(3k-2+3k-3+…+3+1)≤244,3kx-2(3k-1+3k-2+…+3+1)>244,解得1+35-k 這樣的處理思路也有助于學生理解循環的次數可以與輸入的初始值有關. 2. 循環結構中的循環體 循環結構中反復進行操作的部分稱為循環體. 它涉及具體的循環操作的內容,以及輸出的結果. 案例5 如圖5,下列程序運行后輸出的結果是________. 答案應是1×2×#8226;#8226;#8226;×6=720. 這道題在課堂上讓學生思考后,有相當部分的學生認為結果是1+1×2+1×2×3+1×2×3×4+1×2×3×4×5+1×2×3×4×5×6=873. 為什么會出現這種情況呢? 分析一下這個語句的結構.這是兩個循環語句的嵌套問題,但在兩個循環語句之間又插入了另外兩個語句. “S←0”和“a←1”,這就意味著當變量K從2至I循環結束后雖得到S的值,但在變量I再取下一個值時,變量S卻已經清空為0了,它并不是將上次循環的結果再帶入下一次的循環. 因此,就本題而言,實際上只需要考慮變量I取6時所對應的結果就可以了. 事實上,當I=6時,變量K從2至6,循環后輸出的結果是a=1×2×#8226;#8226;#8226;×6=720,因此該程序運行后輸出的結果是720. 3. “For語句”循環的結束問題 案例6?搖如圖6,下列程序中,最后輸出k和i的值分別是____和____. 教材中關于循環語句內容的安排順序是這樣的,先介紹與當型結構所對應的“While語句”以及與直到型結構所對應的“Do-Until語句”,然后再介紹“For語句”,但對“For語句”的介紹,包括書中所配的例題,都只是強調在循環的次數已經確定的情況下,重復進行的步驟可以利用“For語句”來實現. 教師在教學時,也同樣是強調幾次循環后就退出,至于什么時候、什么條件退出,卻沒有講清楚,這也許是教材內容安排的某種缺失,但筆者更愿意相信這是教師在理解把握教材內容方面的缺失. 就本題而言,許多教師和學生就這樣認為:變量i的值從1到20,其步長是3,因此循環的次數是7,變量i最多取到19,因此就有學生認為:由于在整個循環的過程中變量k的值每循環一次就加1,故最后輸出k和i的值分別是7和19. 事實上,正確的答案應該是7和22. 因為變量i在整個循環過程中的取值分別是1,4,7,10,13,16,19,又由于步長是3,所以當變量i等于22時,才退出循環,直接輸出結果. 顯然,這個過程用“While語句”表示更明顯,如圖7.