陳凱





筆者這樣來理解計算思維,它是一種特別的人的思維,這種人的思維可以更具體地認為是一種“能夠將機器按機器的方式模擬出某種人的思維”的思維。本文將問題聚焦于這句話中的“人的思維”一詞,試著以一些具體的思維活動說明人的思維中本身隱含著計算的思維。這種隱藏著的計算的思維還不能被稱為計算思維,直到它被挖掘、顯現出來,并向著機器能夠運作的方式來進行轉化。
● 用折紙來“計算”
考慮一種簡單的依賴折紙來進行“計算”的“裝置”,每一張紙都可以對折,從而在紙的中間留下折痕,這樣,紙所代表的數字就從1(只有一個區域)變為2(有兩個區域),再次對折的話,2就變為4,如圖1所示。看上去好像通過不停地將紙對折,就能實現2的n次方的“計算”。
如果同時實施橫向和縱向的對折,那么似乎還能讓這個“裝置”做乘法。例如,為了知道3乘以5的結果是什么,就橫向折2次,縱向折3次,這樣就顯現出4乘8共32個區域。然后標出其中包括了橫向3個區域和縱向5個區域的范圍,能數出共有15個區域,如圖2所示。
可以針對這個例子來提問:這個折紙的過程算不算是一種計算?假設有一臺機器,它能接受某個人輸入的數值,如3和5,然后就自動開始折紙,最后把3行5列的區域用筆圈出來作為結果還給這個人,那么是不是說這臺機器實施并完成了計算?提出這個問題的意圖將在后面一起分析。
● 用折好的紙來“計算”
準備好一些對折n次且沒有重新攤開的紙,可以想見,對折的次數越多,紙所占的面積就越小,可以從紙的寬窄推測出它所代表的數量,為了方便起見,可以用字母給這些寬窄不同的紙條命名,如圖3所示。
接下來是用這些紙條來“計算”3乘以5。找出紙條C和A放在一起代表5,然后將三組C和A的紙條組合排列成3行,如下頁圖4所示。
接下來,將所有被發現能成對的相同大小的紙條,替換為一張比原有紙條窄一半的紙條,也就是說,兩張A型紙條換成1張B型,兩張B型紙條換成1張C型,以此類推,直到無可替換為止。最后就能得到用A、B、C、D四種類型紙條組成的序列,代表結果15,如下頁圖5所示。
重復剛才的問題,如果某個機器可以自動實施這樣的操作,算不算是一種計算?
● 8888這個數到底有多大——機器的直觀和人的抽象
上面的兩個活動,一是用折紙來做3乘以5,二是用折好的紙,并按某種替換規則來做3乘以5,筆者在調查中發現,對于這兩種方法,認為其屬于計算或不屬于計算的,都有不少支持者,有趣的是,認為后一種方法屬于計算的人要比認為前一種方法屬于計算的人要多。至于為何更多的人認可后者的方法屬于計算,解釋是多樣的。例如有些人說:用前一種方法,就是橫向折紙再縱向折紙來做乘法,最終得到的結果不得不需要一個一個去點數,而不是自動給出一個數字;而用后一種方法,最終的結果是以某種符號的形式呈現的,其實對應了二進制數字符號,如當結果是一個A型紙條和一個D型紙條組成的序列,就知道對應的二進制數是1001。
對于這個解釋,仔細推敲就可以發現存在說不通的地方,因為即便是面對寬窄不同、用于表達某個數量的紙條序列,若想要知道它所代表的實際數量,就必須把這些折起的紙條攤開,去數一下被折痕所分開的區域總共有多少或者要進一步將不同寬窄紙條所代表的數量進行相加——這似乎讓人覺得計算尚未完成。但這個解釋提供了一條可以深入思考的線索,那就是人到底是怎樣去把握數量的。不妨做一個實驗,閉上眼睛,想象一下黑暗的眼前可以同時精確地顯現出多少個亮點。例如,筆者自己經過努力,可以在想象的畫面中呈現出一個4*4陣列的圖案,也就是說,可以同時想象出差不多16個亮點擺放在頭腦中。但5*5陣列的圖案就很難顯現出來,雖然說在想象出來的亮點陣列邊緣,每行5個亮點和每列5個亮點仍然很清晰,但整個亮點陣列的圖案卻是混沌的。即便如此,筆者也能借助深刻腦海的乘法口訣知道那個圖案肯定會有25個亮點。不過,如果是一個帶傳感器的計算機,讓它生成或辨識出幾百個、幾千個、幾萬個乃至更多亮點,應該都沒什么問題。這個例子說明,機器可以直觀地去把握數量(這里不討論機器和人在主動意識上的差異),但人卻不行,人只能直觀比較少的數量,對于很多數量的東西,只能通過一個抽象的數字系統去記錄它。記錄和把握其實是兩件不同的事,舉例說,寫下123456789這樣的9位數,它很容易記住,但實際上,卻不能去直觀到這個數量到底有多少。不過,人可以去做抽象的推演,如89其實是8個10加上9,而789其實是7個100加上8個10再加上9。通過這樣的方法,人就能確信自己能知道123456789這個數字到底是怎么一回事。假設給出兩個數字,一個是十進制數8888,一個是二進制數10001010111000,一般情況下,人自我感覺到仿佛更能夠把握前者而不是后者。但無論頭腦中出現的是8888這個十進制數字還是它所對應的二進制數字的形式,此人都很難真正用頭腦直觀地去感知8888個實體的數量,而只是根據日常習慣,下意識地將8888這一系列數字的符號對應為8×1000+8×100+8×10+8的計算規則,因為非常確信這種規則的正確性,以致于不會真的去計算和驗證一下。人雖然可以相信8888對應了8888的實際數量,也可以相信10001010111000這個二進制數字也對應了此二進制數字想要表達的實際數量,卻不能用直觀來確認十進制的8888和二進制的10001010111000這兩個數字實質是相等的。這其實說明了,人無法直觀一個很大的數量,卻能依靠直觀來確信自己的數字演算系統是合理的。?
設想這樣一個機器,它能通過傳感器數出幕布上亮點的數量,但為了“遷就”人類,就不得不將感知到的數量變成十進制的數碼符號呈現出來。人賦予了這個機器抽象的能力,其原因是人自身對數量的直觀能力是受限的。但人卻有另一種十分重要的直觀能力,那就是能將數字演算系統的局部規則的有效性推廣到整體,并知道這種推廣是正確的,人也相信可以將演算規則推廣擴展到機器上,但機器由于自身“稟賦”的限制,其演算過程和人的思維過程可能存在很大的差異。
● ENIAC這樣做加法和乘法——人將抽象的過程交予機器模擬
通過古老的ENIAC計算機進行運算的例子,可以進一步說明,有哪些和計算有關的思維被隱藏在一個簡單的實現加法或乘法的機械過程中。為簡化問題,這里給出了一個極為簡化的ENIAC數據存儲和顯示面板,它由一列數據輸入面板和兩列數據輸出面板組成。表1顯示的是用數字7加上數字5這個運算的初始狀態。表中的井號表示這里的顯示燈亮,也可以認為是此處存儲了數字1;格子中如沒有井號則表示這里的顯示燈不亮,也可以認為是存儲了數字0。
操作過程中的每一步動作,會使得當前亮著的燈要么發生變化,要么不發生變化。如果發生變化,則當前格子里的燈會熄滅,而緊鄰的上一個格子的燈被點亮,對于最頂端所亮的燈,熄滅后會輪換到本列最底下格子的燈亮起。至于燈什么時候發生變化,則會遵循一系列規則,這個規則和十進制進位法則有關,大家可以觀察第93頁表2中總共10步動作的情況,然后自己推斷燈的變化規律。
需要花費一些時間來理解ENIAC的加法運算過程到底是怎樣的。簡單地說,無論做什么樣的加法,輸入端面板的燈必然會跳動10次,可以想見,在運算過程結束時,輸入端面板燈的狀態就會回到初始時的狀態;而只有當輸入端面板燈的跳動回轉到底部后,輸出端面板的燈才會隨著輸入端面板燈的跳動而一起跳動。ENIAC輸入端面板燈必然跳動10次的這個規則其實賦予了它可以進行乘法運算的能力,設想一下,如果輸出端面板的數字均為0,輸入端只要重復實施加法過程,就能得到乘法運算結果。
對于ENIAC加法過程中燈的跳動方式,觀察者能清晰地觀察其每一步變化,但調查發現,大部分人無法在一開始就直觀地領悟到為什么這種跳動方式是合理的。只有在經過了一些邏輯推理后,才真正領悟到,輸入端一開始做的動作,其實是借助10-X的方法獲取輸入值。舉例說,當輸入端面板的7號燈被點亮時,機器并不“知曉”這代表了7,當燈向上“爬升”,3次變化動作發生時,輸出端都是輪空不動的狀態,所以,當燈“觸頂”并回轉到面板底部時,就剩下了10-3等于7次的數量,可以與輸出面板聯動進行跳動變化。這種加法過程和人做加法的過程有相當大的不同,人可以通過邏輯推理,確認這個過程實際是對所有的數字普遍有效的。
這里做一個簡單的總結,通過折紙和ENIAC實施簡單的數學運算的例子,可以發現以下幾點:①人在計算過程中,常會用抽象來彌補直觀的不足;②人能夠直觀到抽象的正確性;③人也能夠尋找出某種更適合機器實現的機械過程,來代替人的抽象推理過程,并能直觀到它的正確性——即便這個過程和人真正的思維過程很不一致。雖然說以上三點都和計算思維有關,但筆者認為,最后一點應該和計算思維有著更密切的聯系。回到前文的問題,用折紙或排列折紙序列的方式得到乘法的結果,這是不是一種計算?答案可以是否定的,想象一下,宇宙中存在著許多這種會折紙的某物,但卻并不是為了某個特定目的去折紙,同時也沒有某種智慧的生物來觀察它們的折紙的過程和結果,那么,折紙就僅僅是折紙而已。答案也可以是肯定的,當某種智慧的生物發現紙的狀態的變化其實可以對應某種抽象符號系統的變化過程時,折紙也就成為了計算。無論是用折紙來計算,還是用ENIAC來做計算,如果不僅僅看計算結果而是將過程細致地展開,就可知其工作過程和人在做計算時的思維過程有很大的不同,而差異的程度或許可以作為判斷完成某項任務中含計算思維“濃度”的一項依據。