郭芮 福建省廈門第二中學
《普通高中信息技術課程標準(2017年版)》(以下簡稱“新課標”)的頒布實施與新教材的使用,使普通高中信息技術教學由傳統的注重技能實操轉向更加強調學生計算思維等核心素養的培養。筆者結合新課標的要求,梳理出計算思維包含的幾個重要要素:分解、分析、抽象、建模、算法設計、自動化。在教學中,教師可通過算法設計和編程實踐來培養學生對這些要素的理解和應用,以培養他們的邏輯思維、創新能力和問題解決能力。
遞歸問題是指在解決某個問題時,可以通過調用自身來實現的問題。遞歸問題通常需要滿足兩個條件:①基本情況。定義遞歸結束的條件,即最簡單的情況,無需再次遞歸調用自身,直接返回結果。②遞歸關系。將原問題分解成一個或多個規模較小的子問題,并通過遞歸調用自身來解決這些子問題。
遞歸問題與計算思維要素之間存在緊密的關聯,具體如下表所示。
本文以“青蛙跳臺階”問題為例,漸進式地分為簡單、中級、復雜三種情況。“簡單”問題引出遞歸算法?!爸屑墶焙汀皬碗s”問題考查學生對遞歸算法的理解和運用。
活動1:一只青蛙一次可以跳上一級臺階,也可以跳上二級臺階,求這只青蛙跳上n級臺階總共需要多少種跳法。
(1)問題分解(如下頁圖1)

圖1
當n=1時,只有1種跳法;當n=2時,有2種跳法;當n=3時,有3種跳法;當n=4時,有5種跳法;當n=5時,有8種跳法……
(2)問題分析

提取重復邏輯:1,2,3,5,8……當n=n時,可以用倒推的方式來分析問題。青蛙跳上最后一級臺階的方式只有兩種情況,要么是1級跳,要么是2級跳。若青蛙用1級跳的方式跳到最后一級臺階,那么它前面跳的方法共有f(n-1)種;若用2級跳,則共有f(n-2)種。所以,兩種情況加起來就是總種數:f(n)=f(n-1)+fn(n-2)(n≥2)(終止條件:n=1,n=2)。
(3)抽象建模(如圖2)

圖2
(4)編程實現(如圖3)

圖3
設計意圖:借助游戲問題引入課堂教學,活躍課堂氣氛,迅速集中學生的注意力。在問題解決中,自然引出本課課題——遞歸法。
活動2:一只青蛙一次可以跳上一級臺階,也可以跳上二級臺階……還可以跳上n級臺階,求這只青蛙跳上n級臺階總共需要多少種跳法。
(1)問題分解
通過上一道題的練習,學生已經對遞歸算法有了初步認知,并且理解抽象的遞歸表達。所以用f(n)表示青蛙跳上n級臺階的跳法數,設定f(0)=1。
當n=1時,有一種跳法,f(1)=1。
當n=2時,有兩種跳法,一階跳和二階跳:f(2)=f(1)+f(0)=2。
當n=3時,有三種跳法,第一次跳出一階后,后面還有f(3-1)種跳法;第一次跳出二階后,后面還有f(3-2)種跳法;第一次跳出三階后,后面還有f(3-3)種跳法:f(3)=f(2)+f(1)+f(0)=4。
當n=4時,有四種跳法,第一次跳出一階后,后面還有f(4-1)種跳法;第一次跳出二階后,后面還有f(4-2)種跳法;第一次跳出三階后,后面還有f(4-3)種跳法,第一次跳出四階后,后面還有f(4-4)種跳法:f(4)=f(3)+f(2)+f(1)+f(0)=8。
……
(2)問題分析
提取重復邏輯:當n=n時,共有n種跳的方式,第一次跳出一階后,后面還有f(n-1)種跳法;第一次跳出二階后,后面還有f(n-2)種跳法;第一次跳出n階后,后面還有f(n-n)種跳法,最終得出公式為:f(n)-f(n-1)=f(n-1)→f(n)=2*f(n-1)(n≥2)(終止條件:n≤1)。
(3)抽象建模(如圖4)

圖4
(4)編程實現(如圖5)

圖5
遞歸法解決問題的方法:①二要素——遞推與回歸。②找到結束條件。③遞歸算法的實現方式(遞歸算法是數值層層調用實現的,函數先由上向下調用,當達到最底層后,再將數值層層向上返回)。④程序結構——函數和分支結構。函數定義遞歸問題本身,分支結構解決終止條件和調用規律。
設計意圖:在前一個活動實踐的基礎上,給出遞歸算法解決問題的方法,對學生已經構建好的模型框架進一步梳理,幫助學生形成遞歸算法解決問題的思想和方法。
活動3:一只青蛙一次可以跳上一級臺階,也可以跳上二級臺階……還可以跳上m級臺階,求這只青蛙跳上n級臺階總共需要多少種跳法。
(1)問題分解
結合上一道題的思路,得出:f(n)=2f(n-1)-f(n-m-1)。
(2)問題分析
分析1:如果n≤m,因為只能往上跳不能往下跳,所以大于n的都不可以跳,那么這個問題就直接退到問題2。
分析2:如果n>m,要想跳到n級臺階,可以從n-1級跳一步上來,或者從n-2級跳兩步上來……或者從n-m級跳m步上來,所以可以找出遞歸公式。
(3)抽象建模
當n=m時,和上一題的解答思路一致。當n>m時,f(n)=2f(n-1)-f(n-m-1)。
(4)編程實現(如圖6)

圖6
設計意圖:經過前面的活動,讓學生基本掌握遞歸法解決問題的方法。
根據新課標中對計算思維教學的建議,通過遞歸算法的學習讓學生從實際問題出發,感知遞歸、發現規律;理解遞歸算法的基本思想,運用恰當的方式分析和抽象建模,梳理出問題結構,并通過恰當的程序語言和程序控制結構實現遞歸算法。因此,本案例通過由淺入深的青蛙跳臺階問題,讓學生在一個個活動中反復體會遞歸問題“來”與“去”的過程,體驗使用Python語言實現遞歸程序設計的方法,感受算法效率的重要性,增強學生運用算法思想解決實際問題的能力,培養計算思維。
深度學習是指學生的已有經驗或知識與新的經驗和知識之間產生了連接,繼而獲得深層次的學習動機、親身體驗和高階思維,對學生產生深遠影響的學習。在本案例中,學生在同一情境、不同難度的任務驅動下,構建和遷移遞歸思想,從而逐漸形成應用遞歸算法與程序設計解決現實問題的高階思維能力。
算法是抽象后的概念,遞歸算法又是不斷拆解和回歸的過程,更加抽象。對于學生而言,在頭腦中將拆解和回歸的過程復現是比較困難的,因此,教師可引導學生借助數字化平臺可視化觀察遞歸算法的過程、在線檢驗編程結果、查找更好的解決方案等,在幫助學生提高信息意識的同時,強化學生的數字化學習能力,助力計算思維培養。
教師可以借助數字化平臺中的“考試”“搶答”“作業”等功能,對學生的課前基礎、課堂成果、課后練習、階段性學習等進行綜合評價。通過完善教學評價體系,幫助學生了解自身的優劣勢,培養計算思維。
本文以遞歸算法為例,通過趣味的游戲問題,詳細探討如何在教學實施過程中針對問題分析開展“抽象”,并在“抽象”的基礎上實現“建模”,最終培養和發展學生的計算思維,完成對算法大概念核心原理的理解,并在一定程度上反作用于數學關鍵能力的培養,以推進拔尖創新人才培養的持續、健康發展。