【摘 要】高中信息技術(shù)教學(xué)中,遞歸可將復(fù)雜問(wèn)題簡(jiǎn)單化,且遞歸程序代碼較為簡(jiǎn)潔,是程序設(shè)計(jì)必備的算法。遞歸同時(shí)也是高中信息技術(shù)課標(biāo)要求學(xué)生所掌握的算法。在教學(xué)中,教師可從體會(huì)遞歸的原理、深層次理解遞歸、內(nèi)化遞歸思維三個(gè)方面展開(kāi),促進(jìn)學(xué)生理解遞歸,進(jìn)而形成遞歸思維。
【關(guān)鍵詞】高中信息技術(shù);遞歸算法;遞歸程序
【中圖分類號(hào)】G633.67? 【文獻(xiàn)標(biāo)志碼】A? 【文章編號(hào)】1005-6009(2024)19-0071-03
【作者簡(jiǎn)介】張宏亮,南京市第二十九中學(xué)(南京,210036)教師,一級(jí)教師。
遞歸在程序設(shè)計(jì)領(lǐng)域是一種算法,遞歸程序就是利用遞歸算法編寫(xiě)的程序代碼。其中遞歸算法的實(shí)現(xiàn)依賴于函數(shù)。因此,在一個(gè)函數(shù)的函數(shù)體中可以直接或間接地調(diào)用該函數(shù)本身,這樣的函數(shù)稱為遞歸函數(shù),遞歸函數(shù)直接或間接調(diào)用自身的過(guò)程叫作遞歸。[1]
在實(shí)際教學(xué)中,遞歸程序雖然代碼簡(jiǎn)潔,但函數(shù)逐層調(diào)用自己的過(guò)程過(guò)于復(fù)雜,有時(shí)還要逐層返回去執(zhí)行上一層后續(xù)的代碼,教師難講解清楚,學(xué)生易陷入思維混亂。因此,在進(jìn)行遞歸程序教學(xué)時(shí),教師應(yīng)注意設(shè)置情境,引導(dǎo)學(xué)生從形象思維順利過(guò)渡到抽象思維,理解遞歸的本質(zhì)以及遞歸執(zhí)行的原理與過(guò)程。
一、體會(huì)遞歸的原理
體會(huì)遞歸的原理是深入學(xué)習(xí)遞歸的第一步。遞歸的基本思想就是把一個(gè)大的復(fù)雜問(wèn)題逐層轉(zhuǎn)化為一個(gè)與原問(wèn)題相似但規(guī)模較小的子問(wèn)題來(lái)求解,即化繁為簡(jiǎn)、以大化小。
筆者認(rèn)為,教師在教學(xué)中可選取能體現(xiàn)遞歸的原理的案例,讓學(xué)生直觀感受的同時(shí),激發(fā)其繼續(xù)探究遞歸的興趣。案例的選取可從生活中的遞歸入手。如分形圖,利用遞歸算法可以模擬出傳統(tǒng)的幾何方法所不能描述的自然景觀,將復(fù)雜的景物用簡(jiǎn)單的規(guī)則來(lái)生成[2],從視覺(jué)上刺激學(xué)生。如何引導(dǎo)學(xué)生在直觀感受的同時(shí)領(lǐng)悟其中的遞歸思想,是教師教學(xué)的重點(diǎn)。筆者認(rèn)為,可以從引導(dǎo)學(xué)生利用計(jì)算思維分析案例入手。計(jì)算思維解決問(wèn)題一般分為4個(gè)步驟,即分解問(wèn)題、模式識(shí)別、抽象化、算法。以圖1中的遞歸二叉樹(shù)案例為例。
第一步:分解問(wèn)題,教師呈現(xiàn)遞歸二叉樹(shù)代碼運(yùn)行過(guò)程的動(dòng)畫(huà),讓學(xué)生觀察它是如何將遞歸二叉樹(shù)圖形逐步轉(zhuǎn)化為一個(gè)個(gè)規(guī)模較小的子圖形的,使學(xué)生意識(shí)到可將復(fù)雜的圖形分解為較小的簡(jiǎn)單圖形來(lái)求解。
第二步:模式識(shí)別,引導(dǎo)學(xué)生發(fā)現(xiàn)原圖形和子圖形的相似之處。學(xué)生從動(dòng)畫(huà)演示中易發(fā)現(xiàn)二者不僅形狀相似,且畫(huà)法相同。
第三步:抽象化,引導(dǎo)學(xué)生抽象出原圖形和子圖形本質(zhì)的畫(huà)法,即“繪制右子樹(shù)—回到樹(shù)枝節(jié)點(diǎn)—繪制左子樹(shù)—回到樹(shù)枝節(jié)點(diǎn)”。
第四步:算法,不斷重復(fù)執(zhí)行第三步抽象得到的步驟,即可畫(huà)出遞歸二叉樹(shù)。此時(shí)學(xué)生已感知到了原問(wèn)題與子問(wèn)題的關(guān)系,也有了將復(fù)雜問(wèn)題分解成小問(wèn)題來(lái)解決的意識(shí)。據(jù)此,教師可以引出遞歸算法的基本思想。
二、深層次理解遞歸
經(jīng)過(guò)遞歸思想的滲透,學(xué)生即可編寫(xiě)程序。但在編寫(xiě)程序時(shí),學(xué)生往往會(huì)無(wú)從下手,尤其是對(duì)函數(shù)自己調(diào)用自己的過(guò)程感到困惑。因此,本部分教學(xué)的難點(diǎn)在于使學(xué)生深層次理解遞歸,理解函數(shù)自己調(diào)用自己來(lái)解決問(wèn)題的原理與過(guò)程。
教學(xué)遞歸程序的前提是學(xué)生已經(jīng)掌握了自定義函數(shù)。首先,筆者讓學(xué)生用遞歸思想去分析問(wèn)題,明確自定義函數(shù)。其次,用嵌套的形式輔助學(xué)生理解遞歸的執(zhí)行過(guò)程,即遞推然后回歸。具體以年齡問(wèn)題為例闡述如下。
問(wèn)題情境:5個(gè)學(xué)生在一起,第5個(gè)學(xué)生說(shuō)他比第4個(gè)學(xué)生大兩歲,第4個(gè)學(xué)生說(shuō)他比第3個(gè)學(xué)生大兩歲,第3個(gè)學(xué)生說(shuō)他比第2個(gè)學(xué)生大兩歲,第2個(gè)學(xué)生說(shuō)他比第1個(gè)學(xué)生大兩歲,第1個(gè)學(xué)生說(shuō)他今年10歲,請(qǐng)問(wèn)第5個(gè)學(xué)生今年幾歲?
第一步:按照遞歸思想分析該問(wèn)題,以大化小,可知要求第5個(gè)人年齡,先求第4個(gè)人年齡再加2,求第4個(gè)人年齡要先求第3個(gè)人年齡再加2,以此類推。接下來(lái)逐步形成自定義函數(shù),可以發(fā)現(xiàn):計(jì)算某個(gè)人的年齡是重復(fù)的動(dòng)作,即其等于計(jì)算前一個(gè)人的年齡加2,如果是第一個(gè)人年齡,答案就是10??勺远x一個(gè)函數(shù)為age(),功能為求某個(gè)人的年齡。設(shè)變量n代表“當(dāng)前同學(xué)”,則可得到代碼(見(jiàn)圖2)。
第二步:用嵌套的形式輔助學(xué)生理解遞歸的執(zhí)行過(guò)程。遞歸的本質(zhì)是函數(shù)的重復(fù)執(zhí)行,只不過(guò)是通過(guò)函數(shù)自己嵌套自己的方式來(lái)實(shí)現(xiàn)的。筆者認(rèn)為,此處可以讓學(xué)生動(dòng)手實(shí)踐,體會(huì)和感悟函數(shù)的重復(fù)執(zhí)行過(guò)程,如可設(shè)計(jì)如圖3所示的試一試活動(dòng)。實(shí)踐過(guò)程中學(xué)生會(huì)發(fā)現(xiàn)這個(gè)程序會(huì)不斷輸出某個(gè)數(shù),直至報(bào)錯(cuò),教師可借此順利引出解答此題要給出重復(fù)執(zhí)行的終止條件,否則函數(shù)會(huì)無(wú)限地反復(fù)調(diào)用,從而陷入死循環(huán)。
經(jīng)過(guò)以上學(xué)習(xí),教師引導(dǎo)學(xué)生再回過(guò)頭來(lái)分析計(jì)算年齡的遞歸程序,學(xué)生易體會(huì)到雖然age()函數(shù)僅有4行代碼,但實(shí)際上該age()函數(shù)在不斷地重復(fù)執(zhí)行。由于age()函數(shù)執(zhí)行過(guò)程中涉及回歸,筆者認(rèn)為此處可展開(kāi)嵌套,用圖形的形式將抽象的東西具象化,輔助學(xué)生理解遞歸過(guò)程(見(jiàn)圖4)。根據(jù)嵌套的執(zhí)行原理,即先遞推到最內(nèi)層嵌套,只有當(dāng)最內(nèi)層嵌套解決了,才返回上一層嵌套去執(zhí)行后續(xù)的代碼,先是逐層遞推進(jìn)去,然后再逐層返回,且每一層嵌套都是age()函數(shù)本身,學(xué)生也就理解了遞歸“自己”逐層向內(nèi)嵌套“自己”的原理——先逐層嵌套進(jìn)行遞推,再逐層返回進(jìn)行回歸。
經(jīng)過(guò)以上教學(xué),學(xué)生明確年齡問(wèn)題的遞歸程序完整代碼如圖5所示,遞歸終止條件為n==1。遞歸編寫(xiě)的代碼簡(jiǎn)潔易懂。
三、內(nèi)化遞歸思維
圖5中的年齡問(wèn)題較簡(jiǎn)單,用普通的循環(huán)就可以解決,但是現(xiàn)實(shí)中學(xué)生往往會(huì)面臨復(fù)雜的問(wèn)題,解決這類復(fù)雜問(wèn)題時(shí)就需要用到遞歸思維。因此,在教學(xué)中,教師要引導(dǎo)學(xué)生通過(guò)遞歸的案例形成遞歸思維,解決復(fù)雜問(wèn)題。
教師可設(shè)計(jì)經(jīng)典的案例培養(yǎng)學(xué)生的遞歸思維,使其學(xué)會(huì)分解并抽象復(fù)雜問(wèn)題。如走臺(tái)階問(wèn)題:一個(gè)10級(jí)臺(tái)階的樓梯,如果每次只能走一個(gè)臺(tái)階或者兩個(gè)臺(tái)階,那么有多少種走法?
第一步:以大化小,逐層分解問(wèn)題。設(shè)問(wèn):逐步縮小問(wèn)題規(guī)模,分解的若干子問(wèn)題分別是什么?其中最小可直接解決的子問(wèn)題是什么?第二步:尋找關(guān)聯(lián),抽象問(wèn)題。設(shè)問(wèn):原問(wèn)題與分解的若干子問(wèn)題有何關(guān)聯(lián),能否建立計(jì)算模型?學(xué)生容易發(fā)現(xiàn)原問(wèn)題和子問(wèn)題解法相同,即n階臺(tái)階走法=(n-1階臺(tái)階走法)+(n-2階臺(tái)階走法),接著教師引導(dǎo)學(xué)生將解決問(wèn)題的方法抽象成自定義函數(shù),即遞歸函數(shù)。第三步:整理算法,編寫(xiě)程序。
遞歸的優(yōu)勢(shì)在于編寫(xiě)的代碼簡(jiǎn)潔,解決問(wèn)題的邏輯一目了然,尤其是用于解決復(fù)雜問(wèn)題。但遞歸需要較多的時(shí)間和空間,若遞歸的深度過(guò)大還會(huì)導(dǎo)致系統(tǒng)崩潰。因此,在面對(duì)問(wèn)題時(shí),應(yīng)根據(jù)實(shí)際情況選擇是否用遞歸。教師在教學(xué)遞歸程序時(shí),若可以引導(dǎo)學(xué)生快速找到循環(huán)解決的方法,則優(yōu)先用循環(huán)解決,反之嘗試用遞歸思維去解決,也可將遞歸轉(zhuǎn)為非遞歸程序。
【參考文獻(xiàn)】
[1]譚浩強(qiáng).C程序設(shè)計(jì)教程[M].北京:清華大學(xué)出版社,2007:153.
[2]張學(xué)軍, 張萍.遞歸程序探討[J].蘭州文理學(xué)院學(xué)報(bào):自然科學(xué)版,2002,16(1):65-69.