


摘要:通過情景引入幫助學(xué)生對遞歸算法建立豐富的感性經(jīng)驗,激發(fā)學(xué)生的學(xué)習(xí)興趣,進(jìn)而引導(dǎo)學(xué)生學(xué)習(xí)遞歸的概念和應(yīng)用條件,最后通過對6個典型案例的分析總結(jié),幫助學(xué)生掌握遞歸函數(shù)的設(shè)計方法,讓學(xué)生體會到遞歸算法解決問題的獨(dú)特和高效。文章還結(jié)合Python的Turtle圖像函數(shù)庫進(jìn)行遞歸作圖,用直觀的繪圖過程促進(jìn)學(xué)生對遞歸函數(shù)的理解和應(yīng)用,取得良好的教學(xué)效果。
關(guān)鍵詞:Python;遞歸函數(shù);算法;教學(xué)設(shè)計;案例
中圖分類號:TP312? ? ? ? 文獻(xiàn)標(biāo)識碼:A
文章編號:1009-3044(2022)10-0129-02
1 引言
Python語言是高中信息技術(shù)必修課程,具有開源性,語言結(jié)構(gòu)和形式簡潔,非常適合作為中學(xué)生的編程入門語言。在Python的教學(xué)過程中函數(shù)占據(jù)著非常重要的地位,其中遞歸函數(shù)既是教學(xué)重點(diǎn)也是教學(xué)難點(diǎn)。遞歸函數(shù)語句雖然比較簡捷,但遞歸算法的思想學(xué)生較難理解,且函數(shù)在執(zhí)行時又會調(diào)用自身,執(zhí)行過程復(fù)雜,導(dǎo)致學(xué)生學(xué)習(xí)困難。
要理解遞歸函數(shù),理解遞歸算法是基礎(chǔ)。而要理解遞歸算法的思想,必須對遞歸算法有形象具體的認(rèn)識。
2 直觀有趣的教學(xué)情景引入
教師在開始進(jìn)行遞歸算法的教學(xué)時,一定要先創(chuàng)設(shè)情景。通過生動有趣的情景來激發(fā)學(xué)生的求知欲,激發(fā)學(xué)生的學(xué)習(xí)主動性。算法教學(xué)內(nèi)容本身就比較抽象,如果教師不注重創(chuàng)設(shè)情景,教學(xué)過程就會顯得很枯燥。
遞歸函數(shù)的教學(xué)一般是通過斐波那契的兔子問題來引入的。斐波那契的兔子問題有趣但不夠直觀。事實上生活中還有更通俗易懂的遞歸的例子,如:讓學(xué)生朗讀童謠《從前有座山》,通過學(xué)生熟悉的童謠,讓學(xué)生輕松愉快地接受遞歸概念。也可以讓學(xué)生動手玩?zhèn)鹘y(tǒng)游戲“九連環(huán)”“漢諾塔”,通過實踐了解遞歸的過程。通過導(dǎo)入情境,幫助學(xué)生建立關(guān)于遞歸的感性經(jīng)驗,同時也有效激發(fā)學(xué)生的學(xué)習(xí)興趣。
3 遞歸函數(shù)概述
通過創(chuàng)設(shè)情景的鋪墊,讓學(xué)生有了充分的關(guān)于遞歸的經(jīng)驗,接下來教師就可以自然地引入遞歸的概念。
遞歸函數(shù)的典型特征是函數(shù)直接或間接調(diào)用函數(shù)本身。通過該特征,學(xué)生可以很容易學(xué)會判斷一個函數(shù)是不是遞歸函數(shù)。但學(xué)生往往不明白函數(shù)為什么要調(diào)用函數(shù)自身,不明白什么樣的問題可以用遞歸算法解決。
遞歸算法的“自己調(diào)用自己”是手段,其目的是把較大的問題不斷地分解成較小的問題,直到問題可以直接得到答案[1]。
采用遞歸函數(shù)解決問題需要符合三個條件:
(1) 原問題可以通過較小的問題來解決;
(2) 較小的問題與原問題有相同的解法;
(3) 有一個明確的結(jié)束條件。
4 通過案例分析學(xué)習(xí)促進(jìn)概念的理解
在理解了遞歸算法的解題思路并懂得了采用遞歸函數(shù)的三個條件后,還需要通過案例分析幫助學(xué)生進(jìn)一步理解應(yīng)用,把遞歸算法通過程序語言轉(zhuǎn)化為遞歸函數(shù)的程序代碼。
4.1 典型的案例1:遞歸法求累加
累加的一般形式為:acc (n) =1+2+3+…n。利用遞歸算法求累加,可表達(dá)為:
acc(n) = n+acc(n-1),n>1。acc(0)=0。
遞歸結(jié)束條件為:n<=1[2]。
在python中其遞歸函數(shù)的程序代碼可以這樣實現(xiàn):
def acc(n):? ?#定義累加函數(shù)acc
if n<=1:? ? #遞歸結(jié)束條件
return n
else:
return n+acc(n-1)? #調(diào)用函數(shù)自身
#調(diào)用遞歸函數(shù) 求1+2+3+…+10
print(acc(10))
4.2 典型的案例2:求階乘n!
求階乘:n!=n×(n-1)×(n-2)…×2×1= n×( n-1)!
利用遞歸算法求階乘n!,可以把求n的階乘的問題轉(zhuǎn)化成求n-1的階乘的問題。遞歸結(jié)束條件為:n<=1。在python中其遞歸函數(shù)的程序代碼可以這樣實現(xiàn):
def fact(n):? #定義函數(shù)fact
if n<=1:? ?#遞歸結(jié)束條件
return n
else:
return n*fact(n-1)? #調(diào)用函數(shù)自身
#調(diào)用遞歸函數(shù)fact求20!
print(fact(20))
4.3 典型的案例3:斐波那契數(shù)列
fib(n)=fib(n-1)+fib(n-2),n>1。fib(1)=1;fib(0)=0
利用遞歸算法求斐波那契數(shù)列,可以將求fib(n) 轉(zhuǎn)化為求fib(n-1) +fib(n-2) 。遞歸結(jié)束條件為:n<=1。在python中其遞歸函數(shù)的程序代碼可以這樣實現(xiàn):
def fib(n):? #定義函數(shù)fib
if n<=1:? ? #遞歸結(jié)束條件
return n
else:
return fib(n-1) + fib(n-2)? #調(diào)用函數(shù)自身
print(fib(20)) #調(diào)用遞歸函數(shù)fib求斐波那契數(shù)列第20位的值
為了簡化程序便于學(xué)生理解,上述三個例程均默認(rèn)參數(shù)n>=0。
遞歸不但可以用于數(shù)值計算,也可以用于非數(shù)值計算的問題。Python 有繪圖功能強(qiáng)大的turtle(海龜作圖) 。將遞歸應(yīng)用于繪圖,可用簡單的代碼畫出繁復(fù)的圖形,特別能吸引學(xué)生的興趣,有助于學(xué)生進(jìn)一步理解和應(yīng)用遞歸的思想。
4.4 典型的案例4:畫螺旋線
import turtle as t? #引入turtle庫
def spir( len):? #定義遞歸函數(shù)
if len > 0:? #遞歸條件
t.forward(len) #海龜畫出長為len的直線
t.right(45) #改變角度
spir(len - 1) #調(diào)用自身
#調(diào)用遞歸函數(shù)畫螺旋線
spir(100)
4.5 典型的案例5:畫樹枝
import turtle as t? ?#引入turtle庫
def 畫樹枝(枝長):? ?#定義遞歸函數(shù)
if 枝長 > 30:? #遞歸條件
t.fd(枝長);? ?t.rt(20)
畫樹枝(枝長 - 10)
t.lt(40)
畫樹枝(枝長 - 10)
t.rt(20) ;? ? t.up()
t.bk(枝長);? ?t.pd()
# 畫樹枝主程序
t.up()
t.left(90)
t.backward(250)
t.pd()
#調(diào)用遞歸函數(shù)畫樹枝
畫樹枝(100)
4.6 典型的案例6:希爾伯特曲線雙遞歸
from turtle import * #引入turtle庫
def hilL(n):? ?#左旋
if n==0: #結(jié)束條件
pass
if n>0:
right(90)
hilR(n-1) #調(diào)用右旋
forward(l);left(90)
hilL(n-1) #調(diào)用自身
forward(l)
hilL(n-1) #調(diào)用自身
left(90);forward(l)
hilR(n-1) #調(diào)用右旋
right(90)
def hilR(n):? #右旋
if n==0:? #結(jié)束條件
pass
if n>0:
eft(90)
hilL(n-1) #調(diào)用左旋
forward(l);right(90)
hilR(n-1) #調(diào)用自身
forward(l)
hilR(n-1) #調(diào)用自身
right(90);forward(l)
hilL(n-1) #調(diào)用左旋
left(90)
width(3)? # 設(shè)置筆刷寬度
l=10? ? #步幅
hilL(4)? #調(diào)用遞歸函數(shù),參數(shù)為曲線的階數(shù)必須為正整數(shù)
以上6個Python教學(xué)案例代碼簡單、設(shè)計精巧,難度由淺入深,十分有助于學(xué)生學(xué)習(xí)和理解遞歸函數(shù)。特別是后面的三個采用海龜繪圖的例程,繪圖過程直觀生動,兼具啟發(fā)性和趣味性。
在教學(xué)過程中教師還可以將遞歸函數(shù)的執(zhí)行過程做成短視頻,讓學(xué)生通過短視頻觀察代碼的執(zhí)行過程,再上機(jī)編程調(diào)試代碼。上機(jī)時可提醒學(xué)生在執(zhí)行遞歸函數(shù)時觀察語句的執(zhí)行順序和變量的變化過程,有效加深對遞歸算法和函數(shù)調(diào)用過程的理解[3]。
如果有充足的時間,還可以讓學(xué)生分別用循環(huán)和遞歸解決同一問題,通過對比來進(jìn)一步理解遞歸的特點(diǎn)[4]。
5 總結(jié)與反思
學(xué)習(xí)程序設(shè)計的過程本質(zhì)上是將自己的具體經(jīng)驗、感性形象轉(zhuǎn)化為抽象的理論和概念的過程[5]。因為學(xué)生在生活中接觸遞歸算法的機(jī)會較少,所以教師首先要幫助學(xué)生建立充分的實踐體驗,并激發(fā)學(xué)生的學(xué)習(xí)興趣。在此基礎(chǔ)上指導(dǎo)學(xué)生對典型案例進(jìn)行觀察、分析、比較和判斷,讓學(xué)生通過歸納、總結(jié)理解遞歸算法,最后通過上機(jī)編寫、調(diào)試程序完成對遞歸函數(shù)的理解和應(yīng)用。
參考文獻(xiàn):
[1] 唐翠娥,陳小文.遞歸數(shù)據(jù)結(jié)構(gòu)及算法設(shè)計教學(xué)探討[J].福建電腦,2019,35(4):130-131.
[2] 譚浩強(qiáng).C語言程序設(shè)計[M].2版.北京:清華大學(xué)出版社,2008.
[3] 丁雪晶.C語言遞歸函數(shù)教學(xué)的設(shè)計與探討[J].電腦知識與技術(shù),2018,14(16):150-152.
[4] 劉瑞芳,曾海燕.遞歸算法的教學(xué)探討[J].現(xiàn)代計算機(jī),2009,302(3):72-73.
[5] 林東峰.中職VB課程中遞歸算法教學(xué)探索和思考[J].計算機(jī)光盤軟件與應(yīng)用, 2011(9):213-214.
【通聯(lián)編輯:王力】
收稿日期:2021-06-10
作者簡介:蔡毅仁,中學(xué)高級職稱,本科學(xué)歷,長期從事中學(xué)信息技術(shù)教學(xué),熟悉C++、Python,擅長計算機(jī)圖像處理。