王愛勝
在新一輪的課程改革中,信息技術課程核心素養以信息意識、計算思維、數字化學習與創新、信息社會責任為主要內容。其中,最重要卻最易模糊的是計算思維。因為計算思維目前除了在程序設計領域具有認可度之外,在其他領域尚無公認的應用。即使在程序設計領域,基本策略仍然是基于算法與程序的設計本體內容,如何形成計算思維教學設計仍是一線教師面臨的難點。本文根據新一輪課標下的“數值與計算”模塊的教學內容,結合新教材即將采取以Python編程語言為環境,探索數學思維與計算思維的聯系,樹立基于數學思維進行計算思維學習設計的觀念,在一定程度上防止了計算思維的泛化,減少了計算思維在學習中的不確定性。
借分段函數實現程序判斷,看計算思維在解決問題過程中的理論與實踐表現
程序設計的基本流程是由構建數學模型、設計算法、編寫程序代碼、調試程序等環節構成的,這種用計算機解決問題的過程是最受肯定的基于計算思維的學習方式。學習者在接觸編程語言之初,往往更側重于計算機編程語言的語法格式學習,即使因為模仿的作用設計算法,也仍然是根據程序思考過程來進行。因此,不容易體會到計算思維的特質——計算機是如何思考、解決問題的。例如,以分支結構程序為學習內容,我采用“判斷狗狗與人的相當年齡”為問題解決,使學生體會計算思維初步形成的過程。
第一步,對事物的描述。狗是人類的好朋友,是很多老年人的好伙伴。其中,有一個嚴重的問題是,狗會因為衰老、疾病等原因比主人去世得早,這給對它們產生深厚感情的主人造成了傷痛。為了了解狗的年齡規律,也為了疏通主人的情感,擬對狗的年齡與人類年齡進行對比,揭示其生命周期。至此,完全是事物描述,沒有明確的問題解決方案。能想到與人類年齡進行對比,這是學生分析能力和邏輯思維的表現,并非數學思維,也非計算思維。
第二步,構造數學模型。通過網絡調查研究,發現很多與狗的年齡分析相關的方式。與人類年齡對比,又分為幾種情況,可構成如下分段函數。
設人的年齡是y,狗的實際年齡是x。
y=1 (x=1)
y=22 (x=2)
y=22+(x-2)×5 (x>2)
至此,構建數學模型完全是數學思維下的問題分析,與計算思維尚不沾邊,但為計算思維的順利產生打好了基礎,這說明數學的確是科學技術之母。
第三步,設計算法。學生往往容易將設計算法與數學模型的構建混淆。實際上,這是基于計算思維的設計過程。解決本項問題的核心是判斷,所以分析程序結構是其中的關鍵。以下我采用自然語言方式描述算法:
輸入狗的年齡 注:不考慮用變量賦值,是為了提高程序的通用性,這是明確的計算思維。
如果x小于0 進行錯誤提示 注:這是計算機的容錯處理,屬于計算思維范疇。分支算法也是。
否則,繼續判斷如果x=1則顯示1歲;
否則,繼續判斷如果x=2則顯示22歲;
否則,則顯示22+(x-2)×5歲。
至此,把數學思維與基于計算分支程序相結合,初步產生了解決方案,這是基于理論層次的計算思維體現。
第四步,編寫程序代碼。選用Python程序設計語言,按照其語法規則實現相應算法。程序代碼如下:
#!/usr/bin/python
x = int(input("請輸入狗狗的年齡: "))
if x <= 0:
print("你是在逗我吧!")
elif x == 1:
print("相當于 14 歲的人哦。")
elif x == 2:
print("相當于 22 歲的人哦。")
else:
print("對應人類年齡: ", y = 22 + (age -2)*5)
以上程序代碼,采用int()函數轉化字符串為數值,采用if、elif進行判斷設計,這些都遵循了以上算法。
至此,在編程中的計算思維表現主要是在程序語法規范、代碼實現上,體現在程序編寫技能,這是實踐層次的計算思維。特別是能夠設計對輸入字符的數值轉化、對否定情況的分支嵌套,這完全是編程能力,如果從思維角度說自然是計算(機)思維方式的體現。
第五步,調試程序。在以往的調試程序中,可能只局限于運行程序、糾正錯誤,這雖然是非常重要的,但是對于學習者來說,更重要是發現問題并改進程序,并非只完成基本問題即可。例如,可以思考讓程序重復執行,采用循環來改進程序,也可以采用自定義函數模塊來優化程序。至此,優化程序這個進一步思考過程也是建立在計算思維形成的基礎上的。反思整體過程,大家才能夠更深入地體會到,計算思維在利用程序來解決問題的一般過程與方法上具有理論、實踐多重表現。
從隨機游戲的數學判斷,看計算思維在數學思維促進下的成長
從數學模型到算法設計、代碼編程這個過程,很容易讓人忽視數學思維是計算思維的基礎,過于強調算法設計與代碼現實。
這時教師可以以一種外在的狀態去觀察。例如,隨機函數是完全屬于計算機科學的一種函數,它與傳統的數學思維聯系并不直接,采用隨機數進行模擬現象無疑是屬于計算思維范疇?,F代數學研究統計、正態分布等對隨機的理論貢獻常人不易理解,而計算機利用“有限二進制字段上的矩陣線性遞歸”來模擬更真實的隨機數也是基于數學與計算機科學的雙重力量。
姑且不去討論基于計算機強大計算能力下的計算思維的特質,以隨機數的一個應用實例,觀察很容易用分支程序來解決的問題,結合數學思維可以讓程序技術更有技巧、更高效。這種計算思維的發展其實是在數學思維的促進中成長的。
先來閱讀下面基于Python程序設計語言的“石頭、剪刀、布”游戲程序。
#!/usr/bin/env python
import random; #導入隨機模塊
choice=[' ','剪刀','石頭','布']; #數列前面設計1個空,是因為不用0表示
result=['你贏', '你輸','平','你贏','你輸']; #這個數據是關鍵,下面解釋。
nc=int(input('請你出(1.剪刀; 2.石頭; 3.布):'))
print('你出:',choice[nc])
jc=random.randint(1,3) #產生1-3隨機數
print('計算機出:',choice[jc])
print(result[nc-jc+2]) #對應結果
以上程序設計難度不在于隨機數的應用,而在于輸贏這種隨機情況的判斷。這完全可以用邏輯關系,以分支程序(if)去很容易地判斷,也可以思考一種更具有數學思維的方式。
第一,首先對雙方博弈情況進行全面分析:
你出 如果計算機出 對應result 推理數學算式
1剪刀 1剪刀 [2]平 1-1+2
1剪刀 2石頭 [1]你輸 1-2+2
1剪刀 3布 [0]你贏 1-3+2
2石頭 1剪刀 [3]你贏 2-1+2
2石頭 2石頭 [2]平 2-2+2
2石頭 3布 [1]你輸 2-3+2
3布 1剪刀 [4]你輸 3-1+2
3布 2石頭 [3]你贏 3-2+2
3布 3布 [2]平 3-3+2
第二,輸贏判斷本來是一種邏輯關系,根據以上分析轉化成基于列表的對應關系如下:
[0] [1] [2] [3] [4]
你贏 你輸 平 你贏 你輸
并由推理獲得數學公式:nc-jc+2。
第三,基于列表對應關系形成列表,并推導出根據列表判斷結果如下:
result[nc-jc+2]
至此,大家體會到基于計算機編程語言的數據結構是計算思維的一種重要表現形式之一。通過數學推理、數學計算等數學思維來架構更科學、高效的數學結構,會促成更深刻的計算思維形成,這樣的思維是更具有生命力的。
總之,無論是在程序設計過程中觀察計算思維的形成,還是從問題解決中采用數據結構讓數學思維去促進計算思維的成長,這都是面向問題解決的計算思維學習設計的良好發展方向。如果認為用程序實現算法,就會形成計算思維,這樣的“編碼代工”式技術作業流水線缺乏數學思維,是對計算思維非常淺顯的認識。