馬麗燕 于方軍
Python是一門高級動態編程語言,簡潔、易讀,還帶有豐富的第三方庫,能提高編程效率,很多開源的人工智能算法庫也是用Python完成的,因此很多地區的中學信息技術課本引入了Python編程教學,課程內容基本都涉及程序設計基本方法和算法思想的體驗。以Scratch為代表的圖形化編程可以在小學入門階段學習,而Python語言則可作為進階編程語言在中學學習,雖然Python未使用圖形化的編程方式,但其大量的內置函數可以將一些具體的小任務細節封裝,進而幫助學生把注意力集中到解決問題的邏輯上,寫出的代碼也便于閱讀理解,從而更加符合中學生從形象思維過渡到抽象思維、數理思維的智力發展過程,有利于培養學生的計算思維和編程能力。
虛谷號預裝了Python,可以方便地開展Python教學,同時虛谷號支持硬件,能幫助學生在真實的環境中感受程序的魅力。例如,我們可以用虛谷號的Python程序編寫一個“光控燈”程序,讓學生感受“如果……否則……”的分支結構。另外,虛谷號的Python編程環境預裝了占用資源比較大的jupyter notebook,因而建議用IDLE,在虛谷號上可以用“sudo apt-get install idle3”完成安裝,在網絡環境比較好的情況下是能夠很快完成的。
Turtle庫是Python語言中一個很流行的繪制圖像的函數庫,運行起來就像一個小烏龜,它在一個橫軸為x、縱軸為y的坐標系中,根據一組函數指令的控制,從原點(0,0)位置開始移動,從而在它爬行的路徑上繪制了圖形,與Logo語言類似,非常適合設計中小學生的Python入門課例。
圖1就是用Turtle庫學習程序結構的例子,即利用計數循環畫一個正四邊形的案例,通過這個例子可以進行拓展,讓學生設計畫正五邊形、正六邊形……體驗在循環語句中如何設計循環次數、循環條件等,這種以畫圖的形式呈現的直觀形象的方法,符合學生的學習習慣。
虛谷號自己有一個虛谷庫(xugu.py),支持LED燈、馬達、傳感器等硬件,這些硬件兼容Arduino環境,也就是說Arduinon能用的硬件在虛谷號上基本都能用,如果說基于Turtle庫的教學能讓學生“看得見”,那么基于虛谷庫的教學除了可以實現“看得見”,還能讓學生“感受到”。虛谷庫的使用我們可以通過下面的“點燈”案例來體驗:導入虛谷庫“import xugu”,通過led=xugu.LED(8)讓虛谷可以控制接在端口8上的LED燈,led.on()點亮燈,led.off()關閉燈(如圖2)。

這個案例可以讓學生體驗無限循環編程結構,如讓學生實現一個“燈閃爍”的案例,就類似于Arduino中的blink案例實現LED燈亮一秒、滅一秒效果(如圖3)。
教材中設計的算法一般是“枚舉法”,枚舉法就是將問題所有可能的結果一一列舉,從中篩選出正確的答案。一般學習了循環結構,就可以學習枚舉法算法,利用有限的循環嵌套列舉問題的所有結果。這種問題的時間復雜度為O(na),其中a可以是1、2、3或者其他常數,但一定不能是變量,一旦問題時間復雜度上升到O(nn),那么我們一般就不再叫枚舉法,而是稱為“搜索”。




計算機常用的算法大致有兩大類,一類叫蠻力算法,一類叫貪心算法,前者常使用的手段就是搜索,借助計算機的高速運算能力對全部解的空間進行地毯式搜索,直到找到指定解或最優解。“搜索”一般通過遞歸來實現,常見搜索方法有“深度優先搜索”和“廣度優先搜索”,但這些方法對于初學者來說往往不是特別容易理解,下面先重點介紹通過循環來實現的枚舉法。使用枚舉法的關鍵有兩點:一是確定枚舉范圍;二是驗證答案的判定條件。典型的例子就是找水仙花數,水仙花數是指一個三位數,它的每個個位上的數字的3次冪之和等于它本身(如1^3+5^3+3^3=153)。
根據水仙花數是一個三位數可以確定枚舉范圍是range(100,1000),對于每一個三位數i可以得到百位數a=i//100,十位數b=i//10%10,個位數c=i%10,判定條件是ifi*i*i+j*j*j+k*k*k==i*100+
j*10+k,參考代碼如圖4所示。
還有一種方法是枚舉每一個數字——百位數的枚舉范圍是range(1,10),十位數的枚舉范圍是range(0,10),個位數的枚舉范圍是range(0,10),特別注意百位數是不能為0的,而十位數和個位數是可以為0的。判定條件是i*i*i+j*j*j+k*k*k==i*100+
j*10+k,參考代碼如上頁圖5所示。

其他如百錢買百雞、雞兔同籠問題都可以用枚舉法完成,“枚舉法”是非常簡單實用的算法。
另外,遞歸算法也是中學階段應該學習的一種算法,它是指如果函數等在其定義或說明內部直接或間接地出現有其本身的引用,或者為了描述問題的某一狀態,必須用到它的上一狀態,而描述上一狀態,又必須用到它的再上一狀態……這種用自己定義自己的方法,稱之為遞歸。使用遞歸算法關鍵點有三點:一是符合遞歸的描述,即需要解決的問題可以化為子問題求解,而子問題求解的方法與原問題相同,只是數量增大或減少;二是遞歸調用的次數有限;三是必須有遞歸結束的條件。
利用虛谷號的Turtle庫學習遞歸算法也是非常直觀的,如圖6所示是通過畫“科赫雪花”體現遞歸算法,幫助學生理解函數、遞歸調用等概念,進而有效培養學生的計算思維。
通過枚舉法的實例我們知道,只要解決好了“定枚舉范圍”和“驗證答案的判定條件”這兩個關鍵問題,就可以利用“枚舉法”解決各種問題,對于遞歸算法要確定好遞歸體、遞歸次數、遞歸結束條件。另外,算法的實例也可以結合虛谷號用硬件實現,如可以用虛谷號做個小車走迷宮,通過枚舉方式找到所有的走迷宮可能,還可以用到其他的一些復制的機器人程序和人工智能程序中,如果學生們感興趣,可以通過社團或競賽作品形式,幫助學生體驗用虛谷號編程帶來的快樂。