在程序設計的“循環結構”教學中,有一個經典題例就是“1+2+3+……+100”的求和。因為學生都知道高斯公式,相信很多學生都曾質疑過這一算法為何不用高斯公式而要用笨拙的循環?
我以前給學生的解釋是:我們編程的目的是讓計算機幫我們解決問題,類似于高斯公式的規律,是前人總結出來的,直接使用公式,不是讓計算機幫我們解決問題,而成了我們來幫計算機解決問題了。當我們需要解決的問題沒有公式可用時,如何讓計算機來解決呢?有規律可循,我們就能利用循環,讓計算機充分發揮它強大的運算能力和極快的運算速度,得到我們需要的結果。一句話,程序設計時要跳出“人”的思維,采用“機器”的思維。
這種“機器思維”,看似笨拙,卻來得簡單,我們只需要根據規律,讓機器重復運算,不需要太動腦筋思考復雜的解法。“算法”的本質雖然也是解決方法,但它是給機器準備的,不是給人工計算準備的。
現在回頭來看,這種思想與后來周以真教授提出的“計算思維”不謀而合。根據周教授的定義,計算思維是運用計算機科學的基礎概念進行問題求解、系統設計,以及人類行為理解等涵蓋計算機科學之廣度的一系列思維活動。“計算思維”很好地概括了進行科學研究尤其是計算機相關學科研究和思考時應該遵循的科學思維方法。在程序設計的教學中,向學生灌輸計算思維的思想方法,可以使學生更快地步入程序設計的大門。
一次在讓學生設計一個帶單位運算功能的計算器時,遇到了一個棘手的問題。當時僅僅是布置下去任務,并沒有仔細考慮需要解決的細節問題。當學生對司空見慣的單位運算竟束手無策、無從下手時,我才發現這不僅僅是個數學問題、編程問題,更像是一個哲學問題。
表面上看,單位運算還要取決于數值運算的類型:對于一級運算(加法、減法),單位是不需要參與運算的,只要轉換為相同單位即可,如1米+2米=(1+2)米;對于二級運算(乘法、除法),單位卻要參與運算,數值和單位同時分別進行運算,如2米×3米=(2×3)米2,10米÷5秒=(10/5)(米/秒)。雖然看起來確實是這樣的,但問題是,為什么一級運算中單位不參與運算而二級運算中單位卻要參與運算?
在網上與一些信息技術教師討論,大家看法各不相同。有人認為一級運算隱含了一個特殊條件,即單位必須相同,運算才有意義;有人認為一級運算中的單位其實也參與了運算,只不過因為單位相同,看不出是運算過的;還有人認為,單位運算有可能采用的是邏輯運算而非算術運算規則,1米+2米中的單位“米+米=米”就類似于邏輯運算中的“1+1=1”了……
繼續深入討論,最初的數學問題逐漸轉變為哲學問題。為了把問題簡化,避免在舉例時出現眾多單位,我把所有單位都用“U”來表示,無意中這個“單位”就成為一個變量符號了,寫在紙上一看,不由欣喜若狂!——管它什么一級運算、二級運算,只不過是變量的加減乘除、多項式的四則運算,所有的運算都遵循數值運算的法則!
困惑豁然開朗,問題迎刃而解。思維馳騁了一圈又返回原地,反思時忽然意識到,問題的根源還是在于我們缺少計算思維,一直是用自然人的思維在考慮程序問題。
人類一思考,上帝就發笑。可惜沒有上帝來指出我們太多的思維缺陷,只能在上帝的嘲笑中繼續我們的思考,完善我們的思維品質。