摘 要:“算法設計與分析”是計算機相關專業的核心主干課程。“算法設計過程”是“算法設計與分析”課程中的一個重要知識點。算法設計過程內容的掌握程度和應用水平,對課程后續章節的學習效果有直接影響。本文對“算法設計過程”的教學環節進行設計,闡述多種教學方法在教學過程中的運用形式和技巧。課程教學目標是讓學生通過學習掌握算法設計的4個基本步驟,培養學生分析問題、尋找數量關系、通過符號化過程建立數學模型和編寫計算機程序的能力。
關鍵詞:教學設計;算法設計過程;教學環節
0 引言
算法是計算的靈魂,在計算科學和工程實踐中扮演著重要角色。作為計算機相關專業的核心主干課程,“算法設計與分析”的目的是培養學生的計算思維能力,使學生掌握算法設計的基本方法和算法性能分析的基本技術。[1]該課程要求學生具備較好的數學基礎和較強的邏輯思維能力,實現算法時還需要學生具備較強的編程能力。
“算法設計過程”是“算法設計與分析”課程中一個重要的知識點。算法設計過程是一個抽象思維的過程,是對實際問題本質特征的邏輯概括,從而選擇和設計合適的算法框架。算法設計過程這個知識點的掌握程度,對學生泛化該課程所學知識,以解決實際應用和工程問題有重要影響。
本文將“算法設計過程”這一知識點分解為4個步驟:問題分析、抽象、符號化、計算機程序編寫。教學重點是在抽象步驟中找到問題背后隱藏的數量關系。教學設計綜合采用多種教學方法。
1 課堂教學環節設計
1.1 課程導入
教師陳述:在前面章節中,我們了解了應用于語音識別的維特比算法,應用于人臉識別的主分量分析算法,還有求最短路徑的迪杰斯特拉算法。這些算法改變了我們的生活。教師提問:同學們,你們想設計屬于自己的算法嗎?學生自答:略。教師陳述:下面我們就隨著一對兔子走進算法設計的世界。案例引入:19世紀中葉,澳大利亞一個農場主放養了幾只兔子,經過短短60年,兔子數量增長到了100億只。如何設計一個算法,描述兔子的繁殖過程并計算兔子繁殖的數量呢?
1.2 問題描述
教師講解:草原上最初只有一對小兔子,一年后草原上一共有多少對兔子?圍繞這個問題有3個假設條件:一是小兔子一個月以后成為老兔子;二是一對老兔子每月生一對小兔子;三是兔子不死亡。教師陳述:算法設計流程包含相互關聯的4個步驟,即問題分析、抽象、符號化和編寫計算機程序。
1.3 算法設計過程第一個步驟:問題分析
教師講解:為使分析過程形象具體,利用畫圖法。第一個月,只有1對小兔子,到了第二個月它們變成了老兔子。到了第三個月有2對兔子,因為老兔子生下了1對小兔子。第四個月,又出生了1對小兔子,兔子總數變成了3對。我們還可以畫出第五個月、第六個月、第七個月的兔子(此處使用動畫演示)。學生活動:手工畫出第四個月兔子的情況。教師設問:如果要畫出第100個月以后的兔子,會遇到什么樣的難題?學生活動:討論、回答。教師點評:即使有天安門廣場那么大的紙可能也畫不下這么多兔子。為此,必須用抽象的方法,找出隱藏在這張圖背后的規律,從中挖掘出數量關系。
1.4 算法設計過程第二個步驟:抽象
教師講解:以第五個月的兔子為例進行分析。第五個月的老兔子有3對,等于第四個月兔子總對數。因為第四個月的兔子無論是老的還是小的,到了第五個月都變成了老兔子。得到推論1:本月老兔子對數等于上月兔子的總對數。再看第五個月的小兔子共有2對,而第四個月的老兔子也是2對,這兩個數量相等。因為,第四個月的老兔子,到了第五個月每對會生1對小兔子。得到推論2:本月小兔子對數等于上月老兔子的對數。
教師講解:本月兔子總對數=本月老兔子對數+本月小兔子對數,這是自然成立的。這個數量關系太平淡無奇了,就像是一杯白開水。下面,我們在其中加入推論1和推論2,看看能發生什么樣的化學反應?
學生活動:讓學生思考并回答,利用推論2,本月小兔子的對數等于上月老兔子的對數;在此基礎上利用推論1,上月老兔子的對數等于再上一個月兔子的總對數。推論3變成了這樣一種形式:本月兔子對數=上月兔子總對數+上上月兔子總對數。
教師點評:這個數量關系簡潔、深刻、漂亮。至此,一杯白開水變成了一杯咖啡。推論3是用自然語言描述的數量關系,如果在此基礎上進行符號化,形成數學模型,將有助于計算機程序的編寫。
1.5 算法設計過程第三個步驟:符號化
教師講解:第n個月兔子對數表示成F(n)的形式。教師提問:請問如果F(n)表示當本月兔子總對數,那么上月兔子對數和上上月兔子對數怎么表示呢?學生回答:F(n-1)、F(n-2)。教師點評:至此,得到了一個簡潔漂亮的數學公式,F(n)=F(n-1)+F(n-2)。根據前面的分析,F(1)=1,F(2)=1,據此可計算出F(3)=2,以此類推,可得F(12)=144。但是要計算F(100),手工計算不太現實,只能交給計算機程序去完成。
教師講解:根據前面的分析,我們得到了完整的數學模型,包含3種情況,分別是:n=1時,F(n)=1;n=2時,F(n)=1;n>2時,F(n)=F(n-1)+F(n-2)。在此數學模型基礎上編寫計算機程序就容易多了。
1.6 算法設計過程第四個步驟:編寫計算機程序
教師提問:第一個條件用C語言程序怎么表示?學生回答:if(n==1)? return 1。教師提問:第二個條件用C語言程序怎么表示?學生回答:if(n==2)? return 1。教師提問:第三個條件用C語言程序怎么表示?學生回答:if(n==1)? return F(n-1)+F(n-2)。教師點評:這是一個遞歸形式的程序。下面,我們嘗試把這個遞歸程序改寫成非遞歸的程序。
教師講解:本月兔子對數、上月兔子對數和上上月兔子對數分別用變量F3、F2、F1表示。例如,在求第四個月的兔子總對數時需用到第2個月和第3個月兔子總對數,這兩個值上一次計算中已經分別保存在F2和F3中,因此要用上一次的F2和F3值對F1和F2的值進行更新。根據這個遞推準則,得到用循環語句實現的計算機程序(該部分動畫演示和代碼演示)。
1.7 課堂練習
教師提出問題:圍繞一對小兔子一年能繁殖成多少對兔子這個問題,把第二個條件改為:一對老兔子每月生兩對小兔子,其他兩個條件不變。學生活動:思考、作答并現場編程。
1.8 課堂小結
學生活動:讓學生回顧本節課內容,鍛煉學生總結知識的能力。教師點評:設計算法需要經過相互關聯的4個步驟,問題分析是基礎(理清概念和條件),抽象是關鍵(目的是發現規律,也是本次課的重點),符號化是橋梁(方便編寫程序),經過橋梁到達的彼岸就是計算機程序(難點)。
1.9 布置課后思考題
思考題1:假設草原上最開始只有1對小兔子,問兩年后兔子共有多少對?條件:一是每對老兔子1個月生一對小兔子;二是小兔子2個月以后變為老兔子;三是兔子不死亡。用課堂上所講算法設計過程的4個步驟解決問題,編寫遞歸和非遞歸形式的程序。該問題從本節課所講例子修改而來,體現了循序漸進的原則,該思考題可以檢測學生對本知識點的推廣運用能力。
思考題2:斐波那契數列在生活中還有哪些應用?
2 教學反思
一提到算法,同學們普遍的感覺就是“難”“枯燥”,從而產生排斥心理。如何讓算法課講起來生動活潑,讓學生樂于學習,變“要我學”為“我要學”,是筆者一直思考的問題。
在“算法設計過程”知識點各教學環節中,筆者始終堅持學生主體、能力本位的教學理念,主要從兩方面入手。
首先,巧妙設計教學內容,找準教學切入點。在教學內容的設計上,講究分層設計、循序漸進,合理地運用多種教學方法,可以將枯燥難懂的理論概念形象化、生動化,利于學生理解。“算法設計過程”的教學過程分為課程導入、算法設計過程4個步驟的理論講解、計算機程序講解和演示、課堂練習、歸納小結和課后思考,主要運用了如下7種教學方法:
第一,形象教學法。整節課內容用一對兔子的故事串起來。設定一個問題:一對兔子一年能繁殖出多少對兔子?然后講解如何通過設計算法解決這個問題。通過講故事的方式詮釋算法設計過程這一抽象概念,學生聽起來不覺得枯燥。
第二,案例導入法。在新課導入時筆者選擇了廣泛使用的3個著名算法,利用設問用方式,激發學生對算法設計過程的好奇心和學習興趣。
第三,層層遞進法。筆者把算法設計過程分成4個步驟。第一個步驟是問題分析,利用圖例進行分析,然后指出其中的不足之處,即推廣難,從而引入第二個步驟——抽象。抽象可以找到圖背后隱藏的規律,解決推廣難的問題;抽象步驟得到的是自然語言描述的數量關系,但是自然語言描述的數量關系轉換成計算機程序還是不方便,因此引入了第三個步驟——符號化。符號化以后得到了數學模型,以數學模型為橋梁,為了實現智能化運算,避免煩瑣的人工計算,引入了第四個步驟——編寫計算機程序。這樣的講解過程邏輯清楚,抽絲剝繭,層層遞進,引人入勝。
第四,圖例教學法。兔子繁殖規律的分析通過一張圖實現,把抽象概念以圖示的方式清晰地展示給學生們看,并帶他們一起進行兔子繁殖過程的推算。在把計算機遞歸程序改成非遞歸形式時也使用了圖示的方法。
第五,比喻教學法。對學生難以理解的概念利用通俗易懂的例子進行比喻。例如:推論3是一個平淡無奇的數量關系,就像是一杯白開水。但是在這杯白開水中加入推論1和推論2,就會起化學反應,白開水變成了一杯咖啡。這樣的比喻形象而生動。
第六,演示教學法。利用計算機程序和動畫演示,讓學生對知識的印象更深刻,讓學生對程序的執行效果有一個直觀的認識。
第七,課堂練習教學法。為了加深學生對所學知識的理解,檢驗學生的學習效果,筆者改變了原問題3個條件中的一個條件,讓學生根據新的假設條件找到新的數量關系并推導新的數模模型,然后寫出計算機程序,學生跳一跳能“夠得著”。
其次,巧妙設計提問環節,引導學生主動思考。采用案例驅動教學法,使用兔子繁殖的例子貫穿始終,充分調動學生學習的積極性、主動性與創造性,讓學生在學習中積極思考、主動探究、分析問題和尋找答案。在課堂上推進討論式和啟發式教學。隨著問題討論的不斷深入,學生逐步掌握了“算法設計過程”這個知識點。課后思考題筆者選擇了開放性題目,讓學生自主查閱資料,提出解決問題的方案和思路。
3 結語
“算法設計與分析”是計算機專業的主干核心課程,算法設計方法和理論是該課程的主要內容。文本圍繞“算法設計的過程”這一知識點進行教學設計,綜合運用多種教學方法層層遞進開展教學。教學環節中,注重突出以學生為中心,調動學生的主觀能動性。本文闡述的教學方案在實踐中取得了比較好的效果,得到了學生的認可,以后還可以嘗試引入移動信息化教學手段,[2]進一步活躍課堂氣氛,增加互動環節。[3]
參考文獻:
[1] 安思,柯春艷.算法設計與分析課程“混合式學習”教學改革[J].福建電腦,2018,34(08):75+96.
[2] 劉俊梅,馬永剛.移動信息化教學在線性代數教學中的應用——以藍墨云班課為例[J].科教導刊(下),2019(03):97-98.
[3] 牛為華,程曉榮,袁和金,龐春江.基于互動式的“算法設計與分析”課程教學改革[J].數學學習與研究,2019(04):14.
作者簡介:張明鍵(1976—),男,江蘇揚州人,博士,湖南警察學院教授,研究方向:優化算法,大數據與人工智能。