陳凱
有一種數列叫做三角形數列,數列由三角形數組成,它們是1、3、6、10、15、21、28……關于三角形數之名的來歷,看圖1便可知曉。很顯然,第n項三角形數即是前n項自然數之和。對于大部分人來說,通過在頭腦中想象一個三角形點陣的構建過程來計算前n項自然數之和,還是比較容易的。那么,如何讓某個自動裝置也能夠計算出第n項三角形數,或者說計算出前n項自然數的數列和?上一期本欄目的《從數據的空間結構看計算思維——以數列求和為例》這篇文章中提到,為了培養(yǎng)計算思維,需要讓學生體驗到,在自動計算的任務實現(xiàn)的過程中,既要考慮人的需求,同時也要從機器運作的可能性、可行性和效率方面來考慮構建一個自動計算模型的問題。為了達成此目標,方法可能有多種,本文設計方案將體驗過程展開為兩步:第一步是針對計算任務的目標創(chuàng)設出一種自動變換規(guī)則,然后將變換過程實體化;第二步是將變換規(guī)則本身也實體化。
● 第一步:創(chuàng)設自動變換規(guī)則,并將變換過程實體化
如果要設計一個生成三角形數的裝置,那么它的基本結構如圖2所示。
應該如何設定變換規(guī)則?傳統(tǒng)的數學方法很簡單,如從1、2、3開始累加,直到判斷加到n時停止;又如為求得n項三角形數,則先遞歸求n-1項三角形數;再如直接應用n(n+1)/2的通項公式。但對于一個簡單的自動變換裝置來說,這些方法中的數字符號本身的變換和處理是非常困難的,為了更容易將變換過程實體化,可以暫時先避免使用數字符號,而用某種實體的數量來代表某個數。
例如,在畫圖軟件里玩圖形變換,即便是簡單的畫圖軟件,也可以是培養(yǎng)計算思維的好工具,張勤堅老師在《教學設計:畫圖里的計算思維》一文中提到,通過復制、翻轉和拼接,就可以實施有思維含量的實踐操作,筆者深以為然。如何設定畫圖規(guī)則用以實現(xiàn)三角形數的計算呢?能簡單想到的方法如:第一行畫n個點,第二行畫n-1個點,第三行畫n-2個點……每新加一層就少畫一個點,等到不再有點可畫時,則數一下所有點的數量。這樣,就將第n項三角形數的生成過程同構為圖形變換的過程。這里給出一個有趣的謎題,如何在畫圖軟件中,在不觀看屏幕的情況下,只用鍵盤操作來實現(xiàn)n,n-1,n-2……個點累加的效果,也就是說,通過某種機械化重復鍵盤操作動作的方式,實現(xiàn)如下頁圖3所示的圖形變換。
雖然說圖形變換操作是在畫圖軟件中進行的,但換成實物來代替那些點,效果是類似的(如摞瓶子)。然而,這些規(guī)則還是需要依靠人來執(zhí)行的,大家不妨先行思考一下,如何設定規(guī)則,讓一個簡單的裝置自動實現(xiàn)圖形變換操作?
這里再舉一個用類似于用跳棋游戲的方法實現(xiàn)三角形數計算的例子,假設要計算的是第4項三角形數,則可以在初始時放置一排4個“*”號棋。從最左面的棋子開始,“*”號棋可以用它右面的棋子當跳板跳到整排棋子的末尾,如果它右面的棋子也是“*”號棋,則當它跳躍到末尾時變?yōu)椤?”號棋,如果它右面是“#”號棋,則它跳躍到末尾時自動消失。當這一排棋子最左面是“#”號棋時,它的跳躍規(guī)則和“*”號棋類似,它可以用右面的棋子當跳板跳到末尾,如果它右面的棋子也是“#”號棋,則當它跳躍到末尾時變?yōu)椤?”號棋,如果它右面是“*”號棋,則它跳躍到末尾時自動消失。棋子具體跳躍的過程演示如圖4所示,演示中用點來代表跳躍后空出的位置:
當無法再找到可跳躍的棋子時,最后一個棋子處在第10個字符的位置,這就對應了第4項的三角形數是10。
用這兩種形狀的跳棋,按預設規(guī)則跳躍和落子,就可以計算出第n項三角形數。不過,與剛才的分層畫點的方法同樣存的問題是:棋子跳躍和落子的規(guī)則是由人的頭腦來監(jiān)督的,能否制作出一個裝置,讓這個跳棋裝置按規(guī)則自動運行起來?
● 第二步:將變換規(guī)則也實體化
為了制作出一個自動實現(xiàn)變換的裝置,不僅要考慮變換對象和過程的實體化,還要考慮變換規(guī)則本身的實體化。
對于分層畫點的方案,存在這樣的問題:怎樣自動實現(xiàn)后一層畫的點比前一層畫的點恰好少一個?下面給出一種思路:設計出一種拼插板,每個拼插板均是數字1,規(guī)定必須將拼插板左右兩端同時插入拼插槽內,可以想象最上面一排拼插板是懸掛在空中的,新一層的拼插板如果只有一端插入拼插槽,仍然會因為重力作用掉落。按此規(guī)則拼接就能解決剛才的問題(如圖5)。例如,為了計算第3項三角形數,可以排列好三個拼插板,然后陸續(xù)將其他拼插板插入拼插槽內,最后拼接過程會自動停止(想象一下,雖然用于執(zhí)行自動拼接任務的裝置始終在運轉,但拼接的圖案卻不會再發(fā)生變化),用到的拼插板的數量就是第3項三角形數6。
這樣,就在一定程度上將頭腦中的拼圖規(guī)則實體化了,可以讓學習者認識到,非實體化的規(guī)則是依賴于語言的,是靠人腦的規(guī)定而使得圖形產生變化,就好像下棋的雙方都必須遵守該種棋的規(guī)則那樣。而實體化的規(guī)則依賴于某種具體的結構,圖形的變換方式是在結構上被限定的。關于實體化,計算機科學中考慮的重點與通用技術學科中考慮的重點不同,在通用技術學科中,是考慮如何將設計圖樣轉換為實體,在計算機科學中,是考慮如何用實體的變換來同構狀態(tài)的變換過程。但這個方法的實體化還很不徹底,“必須將拼插板左右兩端同時插入拼插槽內”這一步還是需要人來實施。對比上面的拼插板,一個更傳統(tǒng)的實體化的規(guī)則轉換系統(tǒng)可能是這樣實現(xiàn)的:首先,用一個樹狀結構來對應先前的拼圖,樹的節(jié)點處是可以存儲狀態(tài)的,在第一行,按希望計算的項數連續(xù)畫點,在后續(xù)行中,只有當左前方并且右前方的節(jié)點的狀態(tài)是點時,前節(jié)點的狀態(tài)才是點,否則就是空,如上頁圖6所示。這個變換規(guī)則比先前的“每新加一層就少畫一個點”更明確,它解釋了“少畫一個點”在結構上到底是如何做到的。
接下來的任務,是將“只有當左前方并且右前方是點時,則當前格子里才是點”這一規(guī)則進一步還原為更實體的形式,那就是邏輯門之間的連接結構,圖7所示是一個可用于計算第n項三角形數的數字邏輯原理圖,它仿佛是橫過來擺放的樹,其基本原理是依靠用與門獲得鄰近兩個存儲單元的數據并實現(xiàn)邏輯運算的工作,這個可以互動的原理圖是在DigitalJS在線軟件中借助Verilog語言制作的,圖示展現(xiàn)的是計算第3項三角形數為6的情況。這個裝置實現(xiàn)了規(guī)則的“相對”實體化。為什么說“相對”呢?所謂的實體常常是相對于某個更實體的襯底而顯現(xiàn)出來的,而這個更實體的襯底,本身很可能也只是相對于其他襯底而相對顯現(xiàn)為實體,通常來說,只有最底層的電路和機械裝置才能算是絕對的物質實體。關于實體和襯底的關系,大家可以參考侯世達的《哥德爾艾舍爾巴赫:集異璧之大成》一書,限于篇幅這里不再展開。如果要將數字邏輯結構的層次進一步還原為更實體的裝置,就要將邏輯門展開為場效應管或晶體管電路了。
看完分層畫點的例子,再來看跳棋的例子,顯然,跳棋規(guī)則的實體化看上去更加困難,因為棋子不僅要跳過若干個未知數量的其他棋子,還要根據當作跳板的棋子的狀態(tài)來決定自己跳躍后落子時的狀態(tài)。這看上去很難仿照分層畫點的例子直接用邏輯原理圖來完成。所以需要引入一個相對實體化的中間裝置,來實現(xiàn)棋子的跳動。這里給出一種方案:設定某個檢測、匹配和替換裝置,它可以將檢測到的以某種模式鄰近的兩種棋子替換成另外一些棋子。實現(xiàn)整個自動化跳棋裝置的規(guī)則設定相當復雜,限于篇幅這里只給出局部的規(guī)則示例,圖8中所列的規(guī)則,就可以實現(xiàn)部分跳躍動作。
為了實現(xiàn)自動跳棋裝置,需要引入一些輔助的棋子,分別用“a”“b”“c”“d”“.”“_”等符號代表。“a*-->.b”的意思是,把“a*”棋子替換成“.b”棋子。單獨看這個替換規(guī)則,是難以發(fā)現(xiàn)其中的意義的,但這些規(guī)則組合起來使用,就能產生出類似程序變量賦值和分支語句判斷的效果(必須試一下才能體會到)。
接下來,還要思考這個裝置可能是怎樣制造出來的:假設有i1和i2兩個檢測器,當i1檢測器檢測到“a”,并且i2檢測器檢測到“b”時,則把檢測到的棋子替換成“.b”,在所有匹配和替換操作完成后,檢測器右移到新的位置重復剛才的操作。可以發(fā)現(xiàn),這里用到了與的邏輯運算。
假設初始時,棋子按“a****_”的方式擺放,那么只要反復地按以上匹配替換序列操作,棋子的狀態(tài)就會成為“.....###_.”。
可見,這個自動裝置完成了兩項任務,一是“*”號跳棋在跳過“*”號跳棋后變成了“#”號跳棋,二是“*”號跳棋在跳過“#”號跳棋后消失。按類似的思路,將替換規(guī)則加以擴展,就可以實現(xiàn)完整的自動跳棋了。為了測試方便,可使用帶宏功能的文字編輯器,如WPS、Notepad++等來進行實驗。當然,這個自動匹配替換規(guī)則的裝置并非最底層的實體裝置,可以使用存儲器和邏輯門使其進一步實體化。在借助跳棋游戲來實現(xiàn)計算三角形數或自然數數列和的過程中,展現(xiàn)出一個相互依賴的層次系統(tǒng),如圖9所示。
從計算思維培養(yǎng)的目標看,是希望學習者能夠認識到變換規(guī)則實體化過程中層次的存在,并從中領會到當前實現(xiàn)某種計算的變換規(guī)則系統(tǒng),是如何依賴更底層的某個系統(tǒng)的變換規(guī)則來實現(xiàn)的。最后需要說明的是,雖然借助變換規(guī)則的實體化,可以實現(xiàn)并體驗某個特定的計算任務進行的過程,但如果目標不是為了實現(xiàn)某特定的計算任務,而是要創(chuàng)造出一個具有通用計算能力的裝置,必然需要設計一個特殊的實體化的裝置,這個裝置擁有能將各種實現(xiàn)特定計算任務的實體化裝置同構為一個虛擬裝置的能力,顯然,對這個問題的理解還依賴更高階、更綜合的思維。