同構——程式設計中的數學
我講一個從馬爺爺那裡聽來的故事。有一年春節的時候,北京地壇公園的廟會裡人山人海,小朋友們拿著壓歲錢在各種攤位上買自己喜歡的玩具。有一個攤位上圍了一群人。地上一字排開擺了九個小玩具,每個玩具上依次貼著一元、二元、三元……直到九元的標籤。攤主一邊向大家吆喝,一邊講解遊戲規則:“大家快來玩套圈遊戲!一次一元錢,你扔一個,我扔一個,一個玩具只能套一個圈。你要是有三個套中的玩具加到一起值十五元,就可以把玩具都贏走。”
|中國結 | 風車 | 不倒翁 | 孫悟空面具 | 小豬存錢罐 | 九連環 | 汽車 | 兔爺 | 走馬燈 |
| 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 |
有個小男孩掏出一元錢,拿了一個紅色的圈,使勁一扔。真準!正好套在了七塊錢的玩具汽車上,攤主拿出一個藍色的圈,一下子套中了八塊錢的兔爺。
|中國結 | 風車 | 不倒翁 | 孫悟空面具 | 小豬存錢罐 | 九連環 | 汽車 | 兔爺 | 走馬燈 |
| 1 | 2 | 3 | 4 | 5 | 6 | [7] | (8) | 9 |
小男孩又花了一元錢,這次他套中了價值兩元的一個風車,這樣只要他下次再套中那個六元的九連環就贏了。可這次攤主不慌不忙地套住了那隻九連環。
|中國結 | 風車 | 不倒翁 | 孫悟空面具 | 小豬存錢罐 | 九連環 | 汽車 | 兔爺 | 走馬燈 |
| 1 | [2] | 3 | 4 | 5 | (6) | [7] | (8) | 9 |
這下可糟了,如果接下來攤主再套中那個一元錢的中國結,小男孩就要輸了。小男孩漲紅了臉,只能搶先去套那個中國結,他試了兩次終於套中了。
|中國結 | 風車 | 不倒翁 | 孫悟空面具 | 小豬存錢罐 | 九連環 | 汽車 | 兔爺 | 走馬燈 |
| [1] | [2] | 3 | 4 | 5 | (6) | [7] | (8) | 9 |
攤主接下來扔了一個圈,套住了四元錢的孫悟空面具。小男孩套住了五元錢的小豬存錢罐。
|中國結 | 風車 | 不倒翁 | 孫悟空面具 | 小豬存錢罐 | 九連環 | 汽車 | 兔爺 | 走馬燈 |
| [1] | [2] | 3 | (4) | [5] | (6) | [7] | (8) | 9 |
但是攤主扔出一個圈,套住了三元的不倒翁。由於3 + 4 + 8 = 15,小男孩輸了。
|中國結 | 風車 | 不倒翁 | 孫悟空面具 | 小豬存錢罐 | 九連環 | 汽車 | 兔爺 | 走馬燈 |
| [1] | [2] | (3) | (4) | [5] | (6) | [7] | (8) | 9 |
周圍的人看著很好玩,也紛紛掏錢套圈玩。馬爺爺看了一陣,覺得很奇怪,大多數情況下都是攤主贏,偶爾會平局。馬爺爺懷疑攤主一定有什麼祕密,他只是為了避免人們懷疑,有時才故意輸掉遊戲。
馬爺爺回到家,電視里正在講中國古老的《河圖洛書》,據說在文字尚未發明之前,伏羲治理天下的時候,在黃河支流,有烏龜揹負著神祕的圖案爬上岸來。如果把圖案中的圓點數目用現代的方法表示出來,就是一個數學上的三階幻方。
-------------
| 4 | 9 | 2 |
-------------
| 3 | 5 | 7 |
-------------
| 8 | 1 | 6 |
-------------
可別被這個名字嚇到,就是方形的九個格子裡每行、每列、兩個對角線上的三個數字加起來都相等,都等於十五。例如第一行的數字相加是4 + 9 + 2 = 15,第三列的數字相加是2 + 7 + 6 = 15,左上右下的對角線的數字相加是4 + 5 + 6 = 15。等一等——馬爺爺想,我現在知道廟會裡套圈遊戲背後的祕密了。如果要套中的三個玩具加起來等於十五元,那麼就相當於套中了幻方的一行、一列、或一個對角線。如果攤主在櫃檯裡偷偷藏一張三階幻方的圖,那麼他實際上相當於在和遊人玩俗稱“一條龍”的井字棋遊戲。
X | | O
----------
X | X |
----------
O | X | O
廟會中那個小男孩和攤主的套圈遊戲相當於下面的井字棋對局。攤主在關鍵的第三步中給小男孩設定了一個陷阱,他在第一列上和一個對角線上同時可能連成直線,如果小男孩套中3,則攤主套中5依然能贏。如果瞭解過博弈遊戲,或者知道一點程式設計,你就知道井字棋遊戲沒有必勝的策略,如果遊戲雙方都足夠小心,結果一定是平局。偷偷擁有三階幻方圖的攤主這樣就站在了不敗的地位上,而其他遊客一無所知。
| |
----------
| | X
----------
O | |
第一步,男孩套中7,攤主套中8
| | X
----------
| | X
----------
O | | O
第二步,男孩套中2,攤主套中6
O | | X
----------
| | X
----------
O | X | O
第三步,男孩套中1,攤主套中4
O | | X
----------
O | X | X
----------
O | X | O
第四步,男孩套中5,攤主套中3,攤主勝
這個故事是真的麼?當然不是,馬爺爺是個虛構的人物,他在真實世界中名叫馬丁.加德納——舉世聞名的美國趣味數學大師。這個故事來自他的《啊哈!靈機一動》。故事不是發生在北京的地壇公園,而是美國的鄉村小鎮。攤主名叫卡內,而玩遊戲的小男孩實際是一位女士。這個遊戲也不是中國傳統的套圈遊戲,而是用硬幣蓋住一排數字。
這個故事和其中所講的遊戲不斷在說著一個重要的概念——同構。一行九個數字和三行三列的格子同構,相加等於15的目標與行、列、對角線同構,古老的《洛書》和數學幻方同構,馬爺爺和加德納同構,中國的春節廟會和美國鄉村遊樂同構……這其實也是本書想傳達的概念,程式設計和數學同構,和藝術同構,和音樂同構。偉大的發現背後有曲折的故事和性格迥異的數學家。
這個故事還有一層隱喻,問題的表象下隱藏著和它同構的理論實質,我們需要了解抽象的本質而不被具體的現象矇住眼睛。在人工智慧和機器學習日新月異的今天,我們能否還靠著一點點聰明和工程實踐繼續前行?我們是否要開啟那些神祕的黑盒子找到那個指引我們前進的地圖?
《同構——程式設計中的數學》中文版已可以從github上下載:https://github.com/liuxinyu95/unplugged
二零一九年五月於北京
相關文章
- 程式設計師的數學程式設計師
- 聊聊程式設計中的 “魔數”程式設計
- 小學數學程式設計題程式設計
- 剛掙錢的程式設計師同學該如何花錢?程式設計師
- shell程式設計學習筆記(二):Shell中變數的使用程式設計筆記變數
- 一些關係(離散數學中的)的程式設計思想程式設計
- 程式設計師:學校教的數學知識,程式設計根本用不到!程式設計師
- 《程式設計師的數學》思考題(一)程式設計師
- 幽默:js程式設計師的數學不好?JS程式設計師
- 王垠:數學和程式設計程式設計
- JavaScript中的函數語言程式設計JavaScript函數程式設計
- JavaScript 中的函數語言程式設計JavaScript函數程式設計
- 從一個問題中瞭解數學在程式設計中的應用程式設計
- 程式設計師的數學筆記2--餘數程式設計師筆記
- 數學與程式設計——概率論與數理統計程式設計
- 我從程式設計面試中學到的程式設計面試
- 相愛相殺:程式設計師的數學程式設計師
- 淺談程式設計師的數學修養程式設計師
- Js中函數語言程式設計的理解JS函數程式設計
- Python 中的函數語言程式設計Python函數程式設計
- 函數語言程式設計中的常用技巧函數程式設計
- Java中的函數語言程式設計(八)流Stream並行程式設計Java函數程式設計並行行程
- 成為更好的程式設計師必須學習的 4 種程式設計結構程式設計師
- 敏捷思維-架構設計中的方法學 (轉)敏捷架構
- 趣圖:“大學時學習中的程式設計”與“實際工作專案中的程式設計”程式設計
- 好程式設計師web前端分享什麼是前端同構渲染程式設計師Web前端
- 【程式設計師面試寶典】確定兩串亂序同構程式設計師面試
- 同學們,一起來視覺化程式設計吧視覺化程式設計
- 一個程式設計師的數學學習探索之旅程式設計師
- Shell程式設計-04-Shell中變數數值計算程式設計變數
- 《程式設計師的數學》第2版來了!程式設計師
- 好書妙評之《程式設計師的數學》程式設計師
- [TEAP早期試讀]《程式設計師的數學》- 前言程式設計師
- 結構化程式設計--學習筆記程式設計筆記
- Apache Doris 在同程數科數倉建設中的實踐Apache
- 【譯】JavaScript 中的函數語言程式設計原理JavaScript函數程式設計
- 程式設計師職業生涯中的 Norris 常數程式設計師
- Linux 程式設計之Bash中的變數(轉)Linux程式設計變數