總結(jié)波利亞在書中提到的思維方法晴竞,尤其是《How To Solve It》中的啟發(fā)式思考方法六孵,有這樣一些:
時刻不忘未知量(即時刻別忘記你到底想要求什么示辈,問題是什么胜蛉。)萊布尼茲曾經(jīng)將人的解題思考過程比喻成晃篩子闹啦,把腦袋里面的東西都給抖落出來沮明,然后正在搜索的注意力會抓住一切細微的、與問題有關(guān)的東西窍奋。事實上荐健,要做到能夠令注意力抓住這些有關(guān)的東西,就必須時刻將問題放在注意力層面琳袄,否則即使關(guān)鍵的東西抖落出來了也可能沒注意到江场。
用特例啟發(fā)思考。一個泛化的問題往往給人一種無法把握窖逗、無從下手址否、或無法抓住里面任何東西的感覺,因為條件太泛碎紊,所以看起來哪個條件都沒法入手佑附。一個泛化的問題往往有一種 “不確定性”(譬如元素的個數(shù)不確定用含,某個變量不確定等等),這種不確定性會成為思維的障礙帮匾,通過考慮一個合適的特例啄骇,我們不僅使得問題的條件確定下來從而便于通過試錯這樣的手法去助探問題的內(nèi)部結(jié)構(gòu),同時很有可能我們的特例中實質(zhì)上隱藏了一般性問題的本質(zhì)結(jié)構(gòu)瘟斜,于是我們便能夠通過對特例的考察尋找一般問題的解缸夹。
反過來推導。反過來推導是一種極其重要的啟發(fā)法螺句,正如前面提到的虽惭,Pappus在他的宏篇巨著中將這種手法總結(jié)為解題的最重要手法。實際上蛇尚,反向解題隱含了解題中至為深刻的思想:歸約芽唇。歸約是一種極為重要的手法,一個著名的關(guān)于歸約的笑話這樣說:有一位數(shù)學家失業(yè)了取劫,去當消防員匆笤。經(jīng)過了一些培訓之后,正式上任之前谱邪,訓練的人考他:如果房子失火了怎么辦炮捧?數(shù)學家答出了所有的正確步驟。訓練人又問他:如果房子沒失火呢惦银?數(shù)學家答:那我就把房子點燃咆课,這樣我就把它歸約為了一個已知問題。人類思維本質(zhì)上善于“順著”推導扯俱,從一組條件出發(fā)书蚪,運用必然的邏輯關(guān)系,得出推論迅栅。然而殊校,如果要求的未知量與已知量看上去相隔甚遠,這個時候順著推實際上就是運用另一個啟發(fā)式方法——試錯——了库继。雖然試錯是最常用箩艺,又是也是最有效的啟發(fā)法,然而試錯卻并不是最高效的宪萄。對于許多題目而言,其要求的結(jié)論本身就隱藏了推論榨惰,不管這個推論是充分的還是必要的拜英,都很可能對解題有幫助。如果從結(jié)論能夠推導出一個充要推論琅催,那么實際上我們就將問題進行了一次“雙向”歸約居凶,如果原問題不容易解決虫给,那么歸約后的問題也許就容易解決了鹿响,通過一層層的歸約拆撼,讓邏輯的枝蔓從結(jié)論上一節(jié)節(jié)的生長诽凌,我們往往會發(fā)現(xiàn)扶认,離已知量越來越近捧挺。此外萝挤,即便是從結(jié)論推導出的必要非充分推論(“單向”歸約)喳瓣,對問題也是有幫助的——任何不滿足這個推論的方案都不是問題的解:譬如通過駐點來求函數(shù)的最值欣福,我們通過考察函數(shù)的最值(除了函數(shù)邊界點外)替饿,發(fā)現(xiàn)它必然有一個性質(zhì)语泽,即在這個點上函數(shù)的一階導數(shù)為0,雖然一階導數(shù)為0的點未必是最值點视卢,但我們可以肯定的是踱卵,任何一階導數(shù)不為0的點都可以排除,這就將解空間縮小到了有窮多個點据过,剩下的只要做做簡單的排除法惋砂,答案就出現(xiàn)了。再譬如線性規(guī)劃中經(jīng)典的單純形算法(又見《Algorithms》)绳锅,也是通過對結(jié)論的考?察揭示出只需遍歷有限個頂點便必然可以到達最值的班利。此外很多我們熟知的經(jīng)典題目也都是這種思路的典范,譬如《How To Solve It》上面舉的例子:通過一個9升水的桶和一個4升水的桶在河里取6升水榨呆。這個題目通過正向試錯罗标,很快也能發(fā)現(xiàn)答案,然而通過反向歸約积蜻,則能夠不偏不倚的命中答案闯割。另一些我們耳熟能詳?shù)念}目也是如此,譬如:100根火柴竿拆,兩個人輪流取宙拉,每個人每次只能取1~7根,誰拿到最后一根火柴誰贏丙笋;問有必勝策略嗎谢澈,有的話是先手還是后手必勝?這個問題通過試錯就不是那么容易發(fā)現(xiàn)答案了御板。同樣锥忿,這個問題的推廣被收錄在《編程之美》里面:兩堆橘子,各為m和n個怠肋,兩人輪流拿敬鬓,拿的時候你只能選擇某一堆在里面拿(即不能跨堆拿),你可以拿1~這堆里面所有剩下的個橘子,誰拿到最后一個橘子誰贏钉答;問題同上础芍。算法上面很多聰明的算法也都是通過考察所求結(jié)論隱藏的性質(zhì)來減小復雜度的,譬如剛才提到的單純形問題数尿,譬如經(jīng)典面試題“名人問題”仑性、“和最小(大)的連續(xù)子序列”等等右蹦。倒推法之所以是一種極為深刻的思維方法诊杆,本質(zhì)上是因為它充分利用了題目中一個最不易被覺察到的信息——結(jié)論。結(jié)論往往蘊含著豐富的條件嫩实,譬如對什么樣的解才是滿足題意的解的約束刽辙。一般來說,借助結(jié)論中蘊含的知識甲献,我們便可以更為“智能地”搜索解空間宰缤。舉一個直白的例子,有人要你在地球上尋找一棟滿足如下條件的建筑:__層高(填空自己填)晃洒,__風格慨灭,__年代始建,… (省略若干約束條件)球及。對于這樣一個問題氧骤,最平凡的解法是窮舉地球上每一棟建筑,直到遇到一個滿足條件的為止吃引。而更“智能”的(或者說更“啟發(fā)”的)方法則是充分利用題目里面的約束信息筹陵,譬如假若條件里面說要60層樓房,你就不會去非洲找镊尺,如果要拜占庭風格的朦佩,你估計也不會到中國來找,如果要始建于很早的年代的庐氮,你也不會去非常新建的城市里面去找语稠,等等。倒推法是如此的重要弄砍,以至于笛卡爾當時認為可以把一切問題歸結(jié)為求解代數(shù)方程組仙畦,笛卡爾的萬能解題法就是首先將問題轉(zhuǎn)化為代數(shù)問題,然后設(shè)出未知數(shù)音婶,列出方程慨畸,最后解這組(個)方程。其中設(shè)未知數(shù)本質(zhì)上就是一種倒推:通過設(shè)出一個假想的結(jié)論x桃熄,來將題目對x的需求表達出來先口,然后順勢而下推導出x型奥。仔細想想設(shè)未知數(shù)這種手法所蘊含的深刻思想瞳收,也就難怪笛卡爾會認為它是那個解決所有問題的一般性鑰匙了碉京。
試錯。試錯估計是世界上被運用最廣泛的啟發(fā)法螟深,你拿到一個題目谐宙,里面有一些條件,你需要求解一個未知量界弧。于是你對題目這里捅捅那里搗搗凡蜻,你用上所有的已知量,或使用所有你想到的操作手法垢箕,嘗試著看看能不能得到有用的結(jié)論划栓,能不能離答案近一步。事實上条获,如果一個問題的狀態(tài)空間是有限的話忠荞,往往可以通過窮舉所有可能性來找到那個關(guān)鍵的性質(zhì)。譬如這樣一個問題:有一個囚犯帅掘,國王打算處決他委煤,但仁慈的國王給了他一個生還的機會。現(xiàn)在擺在他面前有兩個瓶子修档,一個里面裝了50個白球碧绞,一個裝了50個黑球,這個囚犯有一個機會可以隨便怎樣重新分配這些球到兩個瓶子中(當然吱窝,要保證不空)讥邻,分配完了之后囚犯被蒙上眼睛,國王隨機取一個瓶子給他院峡,他在里面摸出一個球(因為蒙著眼睛兴使,所以也是隨機抽取)撕予,如果白球鲫惶,則活,否則掛掉实抡。問欠母,這個囚犯如何分配,才能最大化生還幾率吆寨。結(jié)合特例和試錯法赏淌,這個題目的答案是很容易發(fā)現(xiàn)的。這樣的題目還有很多啄清。實際上六水,歷史上很多有名的發(fā)現(xiàn)也都是無意間發(fā)現(xiàn)的(可以看作是試錯的一種)。
調(diào)整題目的條件(如,刪除掷贾、增加睛榄、改變條件)。有時候想帅,通過調(diào)整題目的條件场靴,我們往往迅速能夠發(fā)現(xiàn)條件和結(jié)論之間是如何聯(lián)系的。通過扭曲問題的內(nèi)部結(jié)構(gòu)港准,我們能發(fā)現(xiàn)原本結(jié)構(gòu)里面重要的東西旨剥。譬如這樣一個題目(感謝alai同學提供):A國由1000000個島組成,島與島之間只能用船作為交通工具浅缸,有些島之間有船來往轨帜,從任意一個島都可以去到另外任一個島,當然其中可能要換船●媒罚現(xiàn)在有一個警察要追捕一個逃犯蚌父,開始時他們在不同的島上,警察和逃犯都是每天最多乘一次船烟具,但這個逃犯還有點迷信梢什,每個月的13日不乘船,警察則不迷信朝聋。警察每天乘船前都知道逃犯昨天在哪個島上嗡午,但不知道他今天會去哪個島。請證明冀痕,警察一定可以抓到逃犯(即到達同一個島)荔睹。通過拿掉題目中一個關(guān)鍵的條件,觀察區(qū)別言蛇,然后再放上那個條件僻他,我們就能“感覺”到題目的內(nèi)在結(jié)構(gòu)上的某種約束,進而得到答案腊尚。
求解一個類似的題目吨拗。類似的題目也許有類似的結(jié)構(gòu),類似的性質(zhì)婿斥,類似的解方案劝篷。通過考察或回憶一個類似的題目是如何解決的,也許就能夠借用一些重要的點子民宿。然而如何在大腦中提取出真正類似的題目是一個問題娇妓。所謂真正類似的題目,是指那些抽象結(jié)構(gòu)一樣的題目活鹰。很多問題表面看是類似的哈恰,然而抽象結(jié)構(gòu)卻不是類似的只估;另一些題目表面看根本不像,然而抽象層面卻是一致的着绷。表面一致抽象不一致會導致錯誤的蛔钙、無效的類比;而表面不一致(抽象一致)則會阻礙真正有用的類比蓬戚。《Psychology of Problem Solving》里面對此有詳細 的介紹夸楣。后面也會提到宾抓,為了便于腦中的知識結(jié)構(gòu)真正能夠“遷移”子漩,在記憶掌握和分析問題的時候都應(yīng)該盡量抽象的去看待,這樣才能夠建立知識的本質(zhì)聯(lián)系石洗,才能夠最大化聯(lián)想空間幢泼。
列出所有可能跟問題有關(guān)的定理或性質(zhì)。這個不用說讲衫,我們在最初學習解題的時候就是這么做的了缕棵。
考察反面,考察其他所有情況涉兽。很多時候招驴,我們在解題時容易陷入一種特定的手法,比如為什么一定要是構(gòu)造式的來解這個題目呢枷畏?為什么不能是逼近式的别厘?為什么一定要一步到位算出答案?為什么不能從一個錯誤的答案調(diào)整到正確答案拥诡?為什么這個東西一定成立触趴?不成立又如何?等等渴肉。經(jīng)典例子:100個人比賽冗懦,要決出冠軍至少需要賽多少場。
將問題泛化仇祭,并求解這個泛化后的問題披蕉。剛才不是說過,應(yīng)該通過特例啟發(fā)思考嗎乌奇?為什么現(xiàn)在又反倒要泛化呢没讲?實際上,有少數(shù)題目华弓,泛化之后更容易解決食零。即,解決一類問題寂屏,比解決這類問題里面某個特定的問題還要容易贰谣。波利亞稱之為“發(fā)明者悖論”娜搂,關(guān)于“發(fā)明者悖論”,《數(shù)學與猜想》第一卷的開頭有一個絕妙的例子吱抚,可惜這里空間太小百宇,我就不摘抄了- _-|||
以上是我認為最重要的,也是最具一般性的秘豹、放之四海都可用的思維法則携御。一些更為“問題特定”的,或更為現(xiàn)代的啟發(fā)法既绕,可以參見《如何解題:現(xiàn)代啟發(fā)式方法》以及所有的算法書啄刹。不過,在結(jié)束這一節(jié)之前凄贩,還有兩個有趣的啟發(fā)法值得一提:
下意識孵化法誓军。這個方法有點像老母雞孵小雞的過程:我們先把問題的吃透,放在腦子里疲扎,然后等著我們的下意識把它解出來昵时。不過,不宜將這個方法的條件拉伸過遠椒丧,實際上壹甥,除非能夠一直保持一種思索的狀態(tài)(金出武雄所謂“思維體力”),或者問題很簡單壶熏,否則一轉(zhuǎn)頭去做別的事情之后句柠,你的下意識很容易就把問題丟開了。據(jù)說龐加萊有一次在街上久橙,踏上一輛馬車的那一瞬間俄占,想出了一個重要問題的解。其他人也像仿效淆衷,結(jié)果沒一個人成功缸榄。實際上,非但馬車與問題無關(guān)祝拯,更重要的是甚带,龐加萊實際上在做任何事的時候除了投入有限的注意力之外,其他思維空間都讓給了那個問題了佳头。同樣鹰贵,阿基米德從浴缸里面跳出來也是如此;如若不是經(jīng)過了極其痛苦和長時間的思索康嘉,也不會如此興奮碉输。如果你也曾經(jīng)花過幾天的時間思考一個問題,肯定也是會有類似的經(jīng)歷的亭珍。
燙手山芋法敷钾。說白了枝哄,就是把問題扔給別人解決。事實上阻荒,在這個網(wǎng)絡(luò)時代挠锥,這個方法有著無可比擬的優(yōu)越性。幾乎任何知識性的問題侨赡,都可以迅速搜索或請教到答案蓖租。不過,如何在已知知識之外發(fā)掘出未知知識羊壹,如何解決未知問題蓖宦,那就還是要看個人的能力了。數(shù)學界流傳一個與此有關(guān)的笑話:如果你有一個未解決問題舶掖,你有兩個辦法球昨,一,自己解決它眨攘。二,讓陶哲軒對它感興趣嚣州。
除了波利亞的書之外鲫售,陶哲軒的《Solving Mathematical Problems》也對解題的啟發(fā)式思路作了極有意義的介紹,他在書的第一章遵循波利亞的思路從一個具體的題目出發(fā)该肴,介紹了如何運用波利亞在書中提到的各種啟發(fā)式方法來對解題進行嘗試情竹。
總而言之,充分挖掘題目中蘊含的知識匀哄,是解題的最關(guān)鍵步驟秦效。本質(zhì)上,所有啟發(fā)式方法某種意義上都是為此服務(wù)的涎嚼。這些知識阱州,有些時候以聯(lián)想的方式被挖掘出來,此時啟發(fā)式方法充當?shù)谋闶禽o助聯(lián)想的手段法梯。有時候則以演繹和歸納的手法被挖掘出來苔货,此時啟發(fā)式方法則充當助探(輔助探索)工具