陳凱





計算思維和算法思維,這是兩個不同且又有關系的概念,從已有文獻資料看,對兩者概念的辨析并不多見。有教師認為,算法思維是計算思維的一個方面,算法思維的培養是計算思維發展的重要路徑[1];也有教師認為,算法本身就蘊含計算思維的思想和方法[2];甚至有教師斷言,在算法思維的培養中,其實已經培養了大部分的計算思維。[3]讓筆者感興趣的問題是,如何將算法思維和計算思維兩者區別開來?或者換成更通俗的問法,如何說服他人,某一部分的教學內容意在培養計算思維,其中可能也同時包括了算法思維的培養,但又不僅僅是算法思維的培養?
算法一般指求解某一問題所能描述的有限的步驟,從計算機科學的角度看,算法這個概念通過圖靈機的行為和能力得到了精確的定義。但若問算法思維是什么,卻不能簡單地將其等同于設計規則使圖靈機解決某問題的思維,這是因為雖然算法可運行于圖靈機這種計算模型上,但實際問題的解決步驟卻往往借助圖靈等價的計算模型(最常用的是各種高級程序語言)來實現,并不會特意去關注圖靈機規則設定中必然涉及的讀寫頭轉移和數據存儲的方式。也就是說,在實際用算法解決問題的過程中,圖靈機底層的行為往往被封裝起來了。雖然對算法思維進行定義相當困難,但能得到共識的是,算法思維具有以機械化方式進行計算的特征。本文試圖通過幾項教學活動,對計算行為中的思維過程本身進行分析,來說明算法思維是如何在解決問題的過程中發揮作用的,算法思維又是在什么時候趨近計算思維的。
● 十進制和二進制轉換中算法思維向計算思維的趨近
常用的將十進制數轉為二進制數的方法稱為除二取余法(所謂除二其實是用二來除),如圖1所示就是對十進制數35按除二取余法計算出二進制編碼。計算過程的實施者并不需要知道何以如此計算,他只要嚴格遵照預先設定的規則進行除二取余的工作,并記得從下至上倒序讀數,就能得出正確的結果。此過程具有十分顯明的機械化的特征。
請考慮以下與除二取余法略不同的將十進制數轉換為二進制數的方法:首先,在紙張左側寫下某十進制數字,如35,判斷其奇偶,如果是奇數,在其右側寫1,否則寫0。其次,將35整除以2,得到結果置放在下一行,并重復先前動作(如圖2)。由于0整除0總是為0,所以對人來說,自然而然就可以獲知重復動作終止的時刻。
實驗表明,在兩種方法都花費大致同樣時間講授的情況下,在允許學生自由選擇十進制數轉換為二進制編碼的方法時,大部分學生都選擇了第二種方法,選用第一種方法的學生數量僅僅約為總數的三分之一。這是為什么呢?筆者認為,第二種方法將除以2的動作在計算步驟中抽離了出來,完全交由頭腦來處理,將數據的變化通過更簡單的空間上的轉移存儲在紙張上。圖3顯示了兩種計算方法在存儲變化了的數據時,紙張上記錄空間發生變化的狀況。可以看出,在新的方法中,數字的變化情況能夠更簡潔而整齊地記錄在二維的紙張平面上。
考慮一下,假如不用紙筆,完全在頭腦中實現十進制數的二進制編碼轉換,可以進一步將二維空間上的數據記錄方式轉變為一維空間上的數據記錄方式。其過程按時間序列可以簡單記錄為如圖4所示的樣子。
按這樣的方法,可以將數據的變化情況在一維的空間中進行記錄,這使得人能夠更容易通過心算將十進制數轉換為二進制編碼。
類似地,也可以將二進制數轉換為十進制數的數據變化情況,都存儲在一維的空間中,方法是從數碼最左側開始,將每個數碼乘以2后右移一個數位并與該數位上的數字疊加,反復此操作。以二進制數100011舉例演示如圖5所示,空出的位用下畫線表示。
以上事例說明,同樣具有機械性特征的算法,用紙筆計算,與用心腦計算相比,其行為特征是不同的。從這個結論可以得到一個新的研究點的提示,用機械來實施具有機械性特征的算法,與用紙筆、用心腦來實施具有機械性特征的算法,一定是有不同之處的。
傅海倫指出,中國古代數學的算法機械化是與籌算體系下的位置思維協調一致的[4],此文給予筆者很大的啟發是,計算過程中固定的數據存儲位置強化了數學算法中的“機械性”,使得人工實現的重復運作更便于計算機的實現。如果說十進制數轉二進制編碼的除二取余法體現了算法思維的運用,那么本文給出的簡化方法以及心算方法,則有著向計算思維趨近的特征,之所以說“趨近”而不說“體現”,是因為還缺乏一種構造性的方案,讓整個運算過程真正自動化地運行起來。
● 循環結構實現累加中算法思維向計算思維的趨近
在人的頭腦中計算自然數的累加,似乎是件容易的事情,但為什么用循環結構實現自然數累加的程序代碼會讓許多初學者感覺疑惑呢?筆者首先考察的是自己頭腦中的累加過程:首先,有一橫列的自然數1、2、3、4……,然后取出1和2相加得3,頭腦中的景象變為3、3、4、5……,然后取出3和3相加得6,頭腦中的景象變為6、4、5、6……。在整個過程中,加法的結果和數列都在某個一維的數據空間中,而隨著加法的繼續,數列會在尾部自動增長。然而這樣的思維,是很難和循環結構的累加程序代碼相契合的,在對學生的調查中發現,有相當多的學生,在實施自然數累加的過程中的思維模式是和以上方法類似的(這里不考慮使用數列求和公式的方法)。
有興趣的教師也可以自己開展相關調查,調查的一個訣竅是,當學生說用1加上2得3,用3加上3得6,用6加上4得10的時候,重點詢問那個“4”是從何而來的。例如,他可能回答,這個“4”一直在某個列表中,既然“3”已經被使用了,接下來自然是要加上“4”;或者他也可能回答,這個“4”是由原來的自然數“3”加上1得到的……調查的另一個注意事項是,被調查學生不能是已學習過用循環結構語句實現自然數累加的方法的。筆者調查發現,采用前者方法的學生人數要多于后者。
有少數學生給出的思維方法是這樣的,在頭腦中有兩個位置存放數字,分別是累加的數和自然數,初始時是“0,1”,意味著累加值為0,自然數為1。其后進入到將兩個數字的相加并存入左側位置,而右側位置的數字自增1的重復模式,存儲空間變化模式如圖6所示。
在頭腦的整個想象過程中,有如動畫般的變換效果會使得問題更容易理解,如右側位的“1”發生了分解,變換出新的“1”,與左側空間的“0”相加得到“1”,然后右側位的“1”自增變成“2”,然后就是重復以上過程。
以上實驗可以說明,即便是在人的頭腦中進行計算,也往往需要借助固定的數據存儲位置,來實現計算過程的機械化。但數據存儲和調用的具體方式,不總是和計算機處理數據的方式相類似。
● 排序算法中算法思維向計算思維的趨近
將頭腦的排序方法和計算機算法的排序方法進行比較,也可以通過“位置”使用方式看出算法思維與計算思維的不同。
假設一列數據存放在某個一維的空間中,空間最前面和末尾可以任意添加新的空間,這些數據是亂序的,現在要對它們從小到大進行排序,存在兩種情況:①數據量超出了頭腦能同時把握的程度;
②允許隨意閱覽這些數據中相鄰的部分數據。那么,應該如何對數據進行排序呢?大部分人使用的方法是,通過分段閱覽找到其中最小的數字,將這個數字移到這列數據最前面,然后對剩余的數據做同樣的操作。這個方法體現了具有機械化特征的算法思維的運用,但卻較難交由一個真正的機械來實現。對于一個機械來說,每個數據在某一時刻都必須停留在某個位置上,這與人的頭腦處理數據的方式有明顯的不同。為了能讓機械處理數據成為可能,在應用以上排序方法時,就需要在整個數據列的最前面,新開辟出一個存儲數據的位置,然后尋找得到最小的數字,將這個數字移動到這個新開辟的位置,接著還要為后續重復操作做好準備。例如,一個容易想到但效率比較低的方案:將移走數字后留出的空檔,用后續數字逐個移過來填滿(每次移動都會出現新的空檔,然后再用更后的數字填滿),接下來,是要在處于數據列首位的最小數的后面,插入一個新的空檔,以存放第二小的數字,但為了做到這一點,就需要首先在處于首位的最小數字前開辟一個新空間,然后將最小數移動到新的位置,騰出第二個位置。當然,為了使以上操作能夠順利實施,還需要記錄已經移動了幾個數字過來,這樣才能確定將新找到的數字填充到哪里,這個記錄可以存放到空間末尾某個地方,不過這就產生了一個新的麻煩,怎樣避免這個記錄本身不被當成要排序的數據……可以看出,頭腦容易解決的問題,換做用固定位置轉移和填充的機械方法來實現,就相當煩瑣。那么,為了簡化以上煩瑣過程,就需要從算法思維向計算思維趨近。
對比以上煩瑣的機械化的排序過程,才能更好地體現出一些經典排序算法的精妙,以冒泡排序算法為例,可以在數據空間末尾添加四個新的空間,一個用來充當交換數據的臨時變量,一個用來記錄需要排序數據的數量,另外兩個用來記錄冒泡的輪次和比較的位置,程序代碼中除了數據空間自身以外,并沒有其他變量,這樣就在一個固定位置的數據空間中實現了排序,如圖7所示。
對比傳統的冒泡排序算法的程序實現,將程序代碼中所有的變量操作都以列表或數組中數據的變化來加以替代,就使得整個算法更具有機械自動化的直觀性。這就實現了從算法本身的學習向算法之所以能使機械自動化工作有效的探索過程的還原,從而領悟到機械自動化直觀和人類頭腦中所想象和容易理解的自動化兩者間的差別,以及在思考如何在兩者間建立轉換關系的時候,其所需要的思維方式就不能僅用算法思維來涵蓋了。
通過本文的例子回顧“算法本身就蘊含計算思維的思想和方法”這句話,也許能有更深的理解,那就是,可以將計算機的算法看成是算法思維和計算思維的共同成果。在教學中,計算機算法不是現成的等待了解的某物,而是從機械性的思維方法出發,經由研究分析如何讓機械可以真正且有效運作此算法過程而得到的成果,而這種研究分析和實現的路徑,則體現了計算思維的應用。
參考文獻:
[1]周世杰.從計算思維的視角辨析算法中的遞歸與迭代[J].中國信息技術教育,2020(09):53-55.
[2]劉梅彥,徐英慧.大學計算機基礎教學中算法思維的培養[J].軟件導刊,2016(04):199-201.
[3]馬波.從算法思維到計算思維[J].軟件導刊·教育技術,2019(05):71-73.
[4]傅海倫.位置思維方式與數學機械化[J].科學技術與辯證法,2000(01):36.
3808500589294