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