周松星
在現(xiàn)行的教材中,因篇幅所限,保留的只是經(jīng)過千錘百煉、千真萬確的“圣經(jīng)”,而知識的發(fā)現(xiàn)與形成過程較為少見。如果教師只教教材,就容易使學(xué)生變?yōu)橹R的存儲者,而不是知識的發(fā)現(xiàn)者和創(chuàng)造者。教師只有依據(jù)教材結(jié)構(gòu),通過教學(xué)活動展現(xiàn)知識的發(fā)現(xiàn)與形成過程,才能使學(xué)生的思維能力得到鍛煉和發(fā)展。那么,在《算法與程序設(shè)計》選修模塊的教學(xué)中,如何立足揭示過程,使學(xué)生的算法思維得到培養(yǎng)呢?
源于生活,讓學(xué)生熟悉交換算法
在教學(xué)中,應(yīng)啟發(fā)、引導(dǎo)學(xué)生進行實驗探究,讓學(xué)生自主參與學(xué)習(xí)活動,進而深入思考、發(fā)現(xiàn)規(guī)律和掌握精髓。如“交換語句”是程序設(shè)計最基本的語句,在該語句的教學(xué)中,可通過設(shè)計一個實驗“在A杯里裝開水,B杯里裝紅茶,用什么方法可以把兩個杯子里的液體調(diào)換”引導(dǎo)學(xué)生思考。學(xué)生容易想到利用第三個杯子(假設(shè)為T),把A杯的開水倒入T杯,把B杯的紅茶倒入A杯,把T杯的開水倒入B杯。教師再引導(dǎo)學(xué)生將這一過程轉(zhuǎn)化為VB語句,表示為:T=AA=B B=T。這樣,學(xué)生就能通過操作、觀察、分析和推理,由具體的形象思維到抽象思維,理解、掌握了交換兩個變量的值的方法。
基于推導(dǎo),讓學(xué)生領(lǐng)會枚舉算法
人們的認知過程是一個由簡單到復(fù)雜的漸進式過程。在教學(xué)中,要從簡單入手,讓學(xué)生在體驗成功的快樂中學(xué)習(xí)。如在枚舉算法的教學(xué)中,可由一個簡單的問題入手:雞兔同籠,共有12只頭、38只腳,求雞、兔各有多少只?這個問題,如果采用數(shù)學(xué)方法,學(xué)生容易列出二元一次方程組進行求解,但怎樣編寫程序解題呢?教師可用列表法引導(dǎo)學(xué)生分析計算機程序的求解過程。假設(shè)雞的只數(shù)為x,兔的只數(shù)為y。當(dāng)x依次取1~11時,算出y;全部腳的只數(shù)為(2×x+4×y),如下表:
學(xué)生通過觀察,發(fā)現(xiàn)滿足題目要求的解。教師接著提出問題:雞的數(shù)量從1到11依次變化,可用什么語句實現(xiàn)?使頭、腳的數(shù)目滿足要求又可用什么語句實現(xiàn)?引導(dǎo)學(xué)生得出求解問題的程序為:
Private Sub Command1_Click()
Dim X As Integer, Y As Integer
For X=1 To 11
Y=12-X
If 2*X+4*Y=38
ThenPrint“X=”;X,“Y=”;Y
Next X
End Sub
通過以上實例,引導(dǎo)學(xué)生歸納出枚舉算法的思想是:用循環(huán)語句一一列舉可能的解,用條件語句判斷滿足要求的解,二者聯(lián)合使用,就可枚舉出滿足要求的解。
引用故事,讓學(xué)生感悟遞歸算法
適時地引用生活中的故事在教學(xué)中進行類比,可以使學(xué)生由此及彼,起到啟發(fā)思路、提供線索、舉一反三、觸類旁通的作用,有效地化解教學(xué)的難點。如在“遞歸算法與遞歸程序”的教學(xué)中,用一個民間故事“從前有座山,山上有座廟,廟里有一個老和尚在給小和尚講故事,故事里說,從前有座山,山上有座廟,廟里有一個老和尚在給小和尚講故事,故事里說……”來創(chuàng)設(shè)認知情境。教師接著提出問題:這個故事有什么特點?啟發(fā)、引導(dǎo)學(xué)生得出,這個故事在反復(fù)調(diào)用故事本身。由此得出,遞歸算法是一種直接或間接調(diào)用自身的算法。如,我們可以這樣定義N!,N!=N*(N-1)!。因此,求N!可轉(zhuǎn)化為求(N-1)!,這就是遞歸的描述。教師繼續(xù)提問:假設(shè)用函數(shù)F(N)表示N的階乘,當(dāng)N=3時,求解過程是怎樣的?計算規(guī)模將發(fā)生怎樣的變化?遞歸要有一個結(jié)束的條件,那么,遞歸終止(邊界)的條件是什么?啟發(fā)、引導(dǎo)學(xué)生得出F(3)的求解方法以及遞歸終止的條件(0!=1),并用如下算法實現(xiàn):
If N=0 Then F=1ElseF=N*F(N-1)
以上通過設(shè)置問題情景,引導(dǎo)學(xué)生通過類比,對知識進行遷移和變通,使學(xué)生對遞歸算法的理解比較透徹和到位。
模擬排牌,讓學(xué)生理解排序算法
很多人都有打撲克牌的經(jīng)歷,排牌是其中的一個必要過程。利用這一貼近學(xué)生生活的實例,能使學(xué)生從已有的知識中領(lǐng)悟新知識,突破教學(xué)難點。如在“插入排序”教學(xué)中,可以提問學(xué)生玩“斗大”排牌的方法是怎樣的,然后模擬玩“斗大”從小到大排牌的方法,分析插入排序的過程,并提出以下問題讓學(xué)生思考:數(shù)據(jù)后移怎樣用數(shù)組表示?待插入點前移怎樣用數(shù)組的下標表示?引導(dǎo)學(xué)生得出:數(shù)據(jù)后移用數(shù)組表示為:D[i]=D[i-1],待插入點前移用數(shù)組的下標表示為:i=i-1。將模擬排牌的插入排序過程表示為:假設(shè)當(dāng)?shù)?到第n-1個數(shù)據(jù)已經(jīng)按由小到大的順序存放在數(shù)組D中。
①輸入第n個數(shù)據(jù)A;
②i=n(預(yù)設(shè)數(shù)據(jù)A存放的位置);