总结波利亚在书中提到的思维方法,尤其是《How To Solve It》中的启发式思考方法,有这样一些:
时刻不忘未知量(即时刻别忘记你到底想要求什么,问题是 什么。)莱布尼兹曾经将人的解题思考过程比喻成晃筛子, 把脑袋里面的东西都给抖落出来,然后正在搜索的注意力会 抓住一切细微的、与问题有关的东西。事实上,要做到能够 令注意力抓住这些有关的东西,就必须时刻将问题放在注意 力层面,否则即使关键的东西抖落出来了也可能没注意到。
用特例启发思考。一个泛化的问题往往给人一种无法把握、 无从下手、或无法抓住里面任何东西的感觉,因为条件太泛 ,所以看起来哪个条件都没法入手。一个泛化的问题往往有 一种 “不确定性”(譬如元素的个数不确定,某个变量不确定等 等),这种不确定性会成为思维的障碍,通过考虑一个合适 的特例,我们不仅使得问题的条件确定下来从而便于通过试 错这样的手法去助探问题的内部结构,同时很有可能我们的 特例中实质上隐藏了一般性问题的本质结构,于是我们便能 够通过对特例的考察寻找一般问题的解。
反过来推导。反过来推导是一种极其重要的启发法,正如前 面提到的,Pappus在他的宏篇巨著中将这种手法总结 为解题的最重要手法。实际上,反向解题隐含了解题中至为 深刻的思想:归约。归约是一种极为重要的手法,一个著名 的关于归约的笑话这样说:有一位数学家失业了,去当消防 员。经过了一些培训之后,正式上任之前,训练的人考他: 如果房子失火了怎么办?数学家答出了所有的正确步骤。训 练人又问他:如果房子没失火呢?数学家答:那我就把房子 点燃,这样我就把它归约为了一个已知问题。人类思维本质 上善于“顺着”推导,从一组条件出发,运用必然的逻辑关 系,得出推论。然而,如果要求的未知量与已知量看上去相 隔甚远,这个时候顺着推实际上就是运用另一个启发式方法 ——试错——了。虽然试错是最常用,又是也是最有效的启 发法,然而试错却并不是最高效的。对于许多题目而言,其 要求的结论本身就隐藏了推论,不管这个推论是充分的还是 必要的,都很可能对解题有帮助。如果从结论能够推导出一 个充要推论,那么实际上我们就将问题进行了一次“双向” 归约,如果原问题不容易解决,那么归约后的问题也许就容 易解决了,通过一层层的归约,让逻辑的枝蔓从结论上一节 节的生长,我们往往会发现,离已知量越来越近。此外,即 便是从结论推导出的必要非充分推论(“单向”归约),对 问题也是有帮助的——任何不满足这个推论的方案都不是问 题的解:譬如通过驻点来求函数的最值,我们通过考察函数 的最值(除了函数边界点外),发现它必然有一个性质,即 在这个点上函数的一阶导数为0,虽然一阶导数为0的点未 必是最值点,但我们可以肯定的是,任何一阶导数不为0的 点都可以排除,这就将解空间缩小到了有穷多个点,剩下的 只要做做简单的排除法,答案就出现了。再譬如线性规划中 经典的单纯形算法(又见《Algorithms》),也 是通过对结论的考 察揭示出只需遍历有限个顶点便必然可以到达最值的。此外 很多我们熟知的经典题目也都是这种思路的典范,譬如《H ow To Solve It》上面举的例子:通过一个9升水的桶和一个4升水的 桶在河里取6升水。这个题目通过正向试错,很快也能发现 答案,然而通过反向归约,则能够不偏不倚的命中答案。另 一些我们耳熟能详的题目也是如此,譬如:100根火柴, 两个人轮流取,每个人每次只能取1~7根,谁拿到最后一 根火柴谁赢;问有必胜策略吗,有的话是先手还是后手必胜 ?这个问题通过试错就不是那么容易发现答案了。同样,这 个问题的推广被收录在《编程之美》里面:两堆橘子,各为 m和n个,两人轮流拿,拿的时候你只能选择某一堆在里面 拿(即不能跨堆拿),你可以拿1~这堆里面所有剩下的个 橘子,谁拿到最后一个橘子谁赢;问题同上。算法上面很多 聪明的算法也都是通过考察所求结论隐藏的性质来减小复杂 度的,譬如刚才提到的单纯形问题,譬如经典面试题“名人 问题”、“和最小(大)的连续子序列”等等。倒推法之所 以是一种极为深刻的思维方法,本质上是因为它充分利用了 题目中一个最不易被觉察到的信息——结论。结论往往蕴含 着丰富的条件,譬如对什么样的解才是满足题意的解的约束 。一般来说,借助结论中蕴含的知识,我们便可以更为“智 能地”搜索解空间。举一个直白的例子,有人要你在地球上 寻找一栋满足如下条件的建筑:__层高(填空自己填), __风格,__年代始建,... (省略若干约束条件)。对于这样一个问题,最平凡的解法 是穷举地球上每一栋建筑,直到遇到一个满足条件的为止。 而更“智能”的(或者说更“启发”的)方法则是充分利用 题目里面的约束信息,譬如假若条件里面说要60层楼房, 你就不会去非洲找,如果要拜占庭风格的,你估计也不会到 中国来找,如果要始建于很早的年代的,你也不会去非常新 建的城市里面去找,等等。倒推法是如此的重要,以至于笛 卡尔当时认为可以把一切问题归结为求解代数方程组,笛卡 尔的万能解题法就是首先将问题转化为代数问题,然后设出 未知数,列出方程,最后解这组(个)方程。其中设未知数 本质上就是一种倒推:通过设出一个假想的结论x,来将题 目对x的需求表达出来,然后顺势而下推导出x。仔细想想 设未知数这种手法所蕴含的深刻思想,也就难怪笛卡尔会认 为它是那个解决所有问题的一般性钥匙了。
试错。试错估计是世界上被运用最广泛的启发法,你拿到一 个题目,里面有一些条件,你需要求解一个未知量。于是你 对题目这里捅捅那里捣捣,你用上所有的已知量,或使用所 有你想到的操作手法,尝试着看看能不能得到有用的结论, 能不能离答案近一步。事实上,如果一个问题的状态空间是 有限的话,往往可以通过穷举所有可能性来找到那个关键的 性质。譬如这样一个问题:有一个囚犯,国王打算处决他, 但仁慈的国王给了他一个生还的机会。现在摆在他面前有两 个瓶子,一个里面装了50个白球,一个装了50个黑球, 这个囚犯有一个机会可以随便怎样重新分配这些球到两个瓶 子中(当然,要保证不空),分配完了之后囚犯被蒙上眼睛 ,国王随机取一个瓶子给他,他在里面摸出一个球(因为蒙 着眼睛,所以也是随机抽取),如果白球,则活,否则挂掉 。问,这个囚犯如何分配,才能最大化生还几率。结合特例 和试错法,这个题目的答案是很容易发现的。这样的题目还 有很多。实际上,历史上很多有名的发现也都是无意间发现 的(可以看作是试错的一种)。
调整题目的条件(如,删除、增加、改变条件)。有时候, 通过调整题目的条件,我们往往迅速能够发现条件和结论之 间是如何联系的。通过扭曲问题的内部结构,我们能发现原 本结构里面重要的东西。譬如这样一个题目(感谢alai 同学提供):A国由1000000个岛组成,岛与岛之间 只能用船作为交通工具,有些岛之间有船来往,从任意一个 岛都可以去到另外任一个岛,当然其中可能要换船。现在有 一个警察要追捕一个逃犯,开始时他们在不同的岛上,警察 和逃犯都是每天最多乘一次船,但这个逃犯还有点迷信,每 个月的13日不乘船,警察则不迷信。警察每天乘船前都知 道逃犯昨天在哪个岛上,但不知道他今天会去哪个岛。请证 明,警察一定可以抓到逃犯(即到达同一个岛)。通过拿掉 题目中一个关键的条件,观察区别,然后再放上那个条件, 我们就能“感觉”到题目的内在结构上的某种约束,进而得 到答案。
求解一个类似的题目。类似的题目也许有类似的结构,类似 的性质,类似的解方案。通过考察或回忆一个类似的题目是 如何解决的,也许就能够借用一些重要的点子。然而如何在 大脑中提取出真正类似的题目是一个问题。所谓真正类似的 题目,是指那些抽象结构一样的题目。很多问题表面看是类 似的,然而抽象结构却不是类似的;另一些题目表面看根本 不像,然而抽象层面却是一致的。表面一致抽象不一致会导 致错误的、无效的类比;而表面不一致(抽象一致)则会阻 碍真正有用的类比。《Psychology of Problem Solving》里面对此有详细 的介绍。后面也会提到,为了便于脑中的知识结构真正能够 “迁移”,在记忆掌握和分析问题的时候都应该尽量抽象的 去看待,这样才能够建立知识的本质联系,才能够最大化联 想空间。
列出所有可能跟问题有关的定理或性质。这个不用说,我们 在最初学习解题的时候就是这么做的了。
考察反面,考察其他所有情况。很多时候,我们在解题时容 易陷入一种特定的手法,比如为什么一定要是构造式的来解 这个题目呢?为什么不能是逼近式的?为什么一定要一步到 位算出答案?为什么不能从一个错误的答案调整到正确答案 ?为什么这个东西一定成立?不成立又如何?等等。经典例 子:100个人比赛,要决出冠军至少需要赛多少场。
将问题泛化,并求解这个泛化后的问题。刚才不是说过,应 该通过特例启发思考吗?为什么现在又反倒要泛化呢?实际 上,有少数题目,泛化之后更容易解决。即,解决一类问题 ,比解决这类问题里面某个特定的问题还要容易。波利亚称 之为“发明者悖论”,关于“发明者悖论”,《数学与猜想 》第一卷的开头有一个绝妙的例子,可惜这里空间太小,我 就不摘抄了- _-|||
以上是我认为最重要的,也是最具一般性的、放之四海都可 用的思维法则。一些更为“问题特定”的,或更为现代的启 发法,可以参见《如何解题:现代启发式方法》以及所有的 算法书。不过,在结束这一节之前,还有两个有趣的启发法 值得一提:
下意识孵化法。这个方法有点像老母鸡孵小鸡的过程:我们 先把问题的吃透,放在脑子里,然后等着我们的下意识把它 解出来。不过,不宜将这个方法的条件拉伸过远,实际上, 除非能够一直保持一种思索的状态(金出武雄所谓“思维体 力”),或者问题很简单,否则一转头去做别的事情之后, 你的下意识很容易就把问题丢开了。据说庞加莱有一次在街 上,踏上一辆马车的那一瞬间,想出了一个重要问题的解。 其他人也像仿效,结果没一个人成功。实际上,非但马车与 问题无关,更重要的是,庞加莱实际上在做任何事的时候除 了投入有限的注意力之外,其他思维空间都让给了那个问题 了。同样,阿基米德从浴缸里面跳出来也是如此;如若不是 经过了极其痛苦和长时间的思索,也不会如此兴奋。如果你 也曾经花过几天的时间思考一个问题,肯定也是会有类似的 经历的。
烫手山芋法。说白了,就是把问题扔给别人解决。事实上, 在这个网络时代,这个方法有着无可比拟的优越性。几乎任 何知识性的问题,都可以迅速搜索或请教到答案。不过,如 何在已知知识之外发掘出未知知识,如何解决未知问题,那 就还是要看个人的能力了。数学界流传一个与此有关的笑话 :如果你有一个未解决问题,你有两个办法,一,自己解决 它。二,让陶哲轩对它感兴趣。
除了波利亚的书之外,陶哲轩的《Solving Mathematical Problems》也对解题的启发式思路作了极有意义的 介绍,他在书的第一章遵循波利亚的思路从一个具体的题目 出发,介绍了如何运用波利亚在书中提到的各种启发式方法 来对解题进行尝试。总而言之,充分挖掘题目中蕴含的知识 ,是解题的最关键步骤。本质上,所有启发式方法某种意义 上都是为此服务的。这些知识,有些时候以联想的方式被挖 掘出来,此时启发式方法充当的便是辅助联想的手段。有时 候则以演绎和归纳的手法被挖掘出来,此时启发式方法则充 当助探(辅助探索)工具。
一点思考
1. 联想的法则
人类的大脑是一个复杂而精妙的器官,然而某种程度上,人 类的大脑也是一个愚蠢的器官。如果你总结过你解过的一些 有意义的好题目,你会发现它们有一个共同点:没有用到你 不知道的知识,然而那个最关键的、攸关成败的知识点你就 是想不到。所以你不禁要问,为什么明明这个知识在我脑子 里(也就是说,明明我是“能够” 解决这个问题的),但我就是没法想到它呢?“你是怎么想 到的?”这是问题解决者最常问的一个问题。甚至对于熟练 的解题者来说,这个问题的答案也并不总是很明确的,很可 能他们自己也不清楚那个关键的想法是怎么“蹦”出来的。 我们在思考一个问题的时候,自己能意识到的思维部分似乎 是很少的,绝大多数时候我们能感知到的就是一个一个的转 折点在意识层面显现,我们的意识就像一条不连续的线,在 其上的每一段之间那个空档内发生了什么我们一无所知,往 往我们发现被卡在一个地方,我们苦思冥想,然后一个知识 (也许是一个性质,也许是一个定理)从脑子里冒了出来, 或者说,被我们意识到,然后我们沿着这条路走一段,然后 又卡住,然后又等待一个新的关键知识的出现。而至于这些 知识是怎么冒出来的?我们可以对它们的“冒出来”提供怎 样的帮助?我们可以在意识层面做一些工作,帮助我们的下 意识联想到更多重要的知识吗?那些灵光一现的瞬间,难道 只能等待它们的出现?难道我们不能通过一些系统化的步骤 去“捕获”或“生成”它们?又或者我们能不能至少做些什 么工作以使得它们更容易发生呢?正如金出武雄在《像外行 一样思考,像专家一样实践》中所说的,人类的灵感一定是 有规律的,认知科学目前至少已经确认了人类思维的整个物 质基础——神经元。而既然它们是物质,自然要遵循物质的 运行规律。只不过我们目前还没有窥破它们,但至少我们可 以确信的是,它们在那里。事实上,不需要借助于认知科学 ,单单是通过对我们自己思维过程的自我观察,也许就已经 能够总结出一些重要的规律了,也许,对自身思维过程的反 观真的是人有别于其它动物的本质区别。《专注力》当中有 这样一个例子:一天夜里,你被外面的吵闹声叫醒了,你出 去一看,发现有一群人,其中有一个人开着很名贵的轿车, 他跟你说他们正在玩一个叫“拾荒者”的游戏,由于一些原 因,他必须要赢这个游戏,现在他需要一块1.5m*1m 的木板,如果你能帮忙的话,愿以一万美元酬报。你怎么办 ?被测试的大多数人都没有想到,只要把门拆给他就可以了 (如果你想到了,祝贺你:-)),也许你会说现在的门都 是钢的,没关系,那你有没有想到床板、立柜的门、大桌子 的桌面之类的?这个问题测试的就是心理学上所谓的“范畴 陷阱”,“木板”这个名词在你脑子里的概念中如果是指“ 那些没有加工的,也许放在木材厂门口的,作为原材料的木 板”的话,那么“木板”就会迅速在你的下意识里面建立起 一个搜索范畴,你也会迅速的反应到“这深更半夜叫我上哪 去找木板呢?”如果你一下就想到了,那么很大的可能性是 “木板”这个概念在你脑子里的范畴更大,更抽象,也许包 含了所有“木质的、板状的东西”。这就是联想的法则。我 们的大脑无时无刻不在对事物进行归类,实际上,不仅是事 物,一切知识,都在被自动的归类。在有关对世界的认知方 面,被称为认知图式,我们根据既有的知识结构来理解这个 世界,会带来很大的优势。实际上,模块化是一个重要的降 低复杂性的手段。然而,知识是一把双刃剑,一方面,它们 提供给了我们解决问题的无以伦比的捷径优势,“砖头是砌 墙的”,于是我们遇到砌墙这个问题的时候就可以迅速利用 砖头。然而另一方面,知识却也是思维的桎梏。思维定势就 是指下意识遵循既有知识框架思考的过程。上面的那个木板 的例子也是思维定势的例子。每一个知识都是一个优势,同 时又是一个束缚。著名的科幻作家阿瑟·克拉克有一句名言 :如果一位德高望重的老科学家说某个事情是不可能的,那 么他很可能是错的。所以,如何在获取知识优势的同时,防 止被知识束缚住,是一门技术。
掌握这门技术的钥匙,就是抽象。在吸收知识的时候进行抽 象,同时在面对需要用到知识的新问题时也要对问题进行抽 象。就以大家都知道的“砖头”有多少种用途为例,据说这 道题目是用于测试人的发散思维的,能联想到的用途越多, 思维定势就越小。实际上,借助于抽象这个利器,这类题目 (乃至更广的一类问题)是可以系统性的进行求解的,我们 只需对砖头从各个属性维度进行抽象。譬如,砖头是——长 方形的(长方形的东西有什么用途?还有哪些东西也是长方 形的,它们都有什么用途?)、有棱角的(问题同上)、坚 硬的、固体、有一定大小的体积的、红色的、边界线条平直 的、有一定重量的... 对于每一个抽象,我们不妨联想还有其他什么物体也是具有 同样抽象性质的,它们具有同样的用途吗?当然,除了抽象 之外,还有“修改”,我们可以在各个维度上对砖头的属性 进行调整,以期得到新的属性:譬如大小可以调整、固体可 以调整为碎末、棱角可以打磨、重量也可以调整、形状也可 以调整... 然后看看新的属性可以如何联想开去。
除了这个简单的例子之外,我们也不妨看一看一些算法上的 例子,同样一个算法,不同的人来理解,也许你脑子里记得 的是某个特定的巧妙技巧(也许这个技巧在题目的某步关键 的地方出现,从而带来了最令人意外的转折点),然而另一 人个记得得也许是“递归”这种手法,还有另外一个人记得 的也许是“分治”这种更一般化的解题思路。从不同的抽象 层面去掌握这道题目的知识信息,以后遇到类似的问题,你 能够想起这道题所提供的知识的可能性是有极大的差异的。 《Psychology of Problem Solving》的第11章举了这样一个例子:先让被试 (皆为大学生)阅读一段军事材料,这个材料是说一小撮军 队如何通过同时从几个不同方向小规模攻击来击溃一个防守 严实的军事堡垒的。事实上这个例子的本质是对一个点的同 时的弱攻击能够集聚成强大的力量。然后被试被要求解决一 个问题:一个医生想要用X射线杀死一个恶性肿瘤,这个肿 瘤只可以通过高强度的X射线杀死,然而那样的话就会伤及 周围的良好组织。医生应该怎么办呢?在没有给出先前的军 队的例子的被试中只有10%想到答案,这是控制基线。然 后,在先前学习了军队例子的被试中,这个比例也仅仅只增 加到30%,也就是说只有额外20%的人“自动”地将知 识进行了转移。最后一组是在提醒之下做的,达到了75% ,即比“自动”转移组增加了45%之多。这个例子说明, 知识的表象细节会迷惑我们的眼睛,阻碍我们对知识的运用 ,在这个例子中是阻碍问题之间的类比。而抽象,则正是对 非本质细节去枝减叶的过程,抽象是我们在掌握知识和解决 问题时候的一把有力的奥卡姆剃刀。所以,无论是在解题还 是在学习的过程中,问自己一个问题“我是不是已经掌握了 这个知识最深刻最本质的东西”是非常有益的
时刻不忘未知量(即时刻别忘记你到底想要求什么,问题是 什么。)莱布尼兹曾经将人的解题思考过程比喻成晃筛子, 把脑袋里面的东西都给抖落出来,然后正在搜索的注意力会 抓住一切细微的、与问题有关的东西。事实上,要做到能够 令注意力抓住这些有关的东西,就必须时刻将问题放在注意 力层面,否则即使关键的东西抖落出来了也可能没注意到。
用特例启发思考。一个泛化的问题往往给人一种无法把握、 无从下手、或无法抓住里面任何东西的感觉,因为条件太泛 ,所以看起来哪个条件都没法入手。一个泛化的问题往往有 一种 “不确定性”(譬如元素的个数不确定,某个变量不确定等 等),这种不确定性会成为思维的障碍,通过考虑一个合适 的特例,我们不仅使得问题的条件确定下来从而便于通过试 错这样的手法去助探问题的内部结构,同时很有可能我们的 特例中实质上隐藏了一般性问题的本质结构,于是我们便能 够通过对特例的考察寻找一般问题的解。
反过来推导。反过来推导是一种极其重要的启发法,正如前 面提到的,Pappus在他的宏篇巨著中将这种手法总结 为解题的最重要手法。实际上,反向解题隐含了解题中至为 深刻的思想:归约。归约是一种极为重要的手法,一个著名 的关于归约的笑话这样说:有一位数学家失业了,去当消防 员。经过了一些培训之后,正式上任之前,训练的人考他: 如果房子失火了怎么办?数学家答出了所有的正确步骤。训 练人又问他:如果房子没失火呢?数学家答:那我就把房子 点燃,这样我就把它归约为了一个已知问题。人类思维本质 上善于“顺着”推导,从一组条件出发,运用必然的逻辑关 系,得出推论。然而,如果要求的未知量与已知量看上去相 隔甚远,这个时候顺着推实际上就是运用另一个启发式方法 ——试错——了。虽然试错是最常用,又是也是最有效的启 发法,然而试错却并不是最高效的。对于许多题目而言,其 要求的结论本身就隐藏了推论,不管这个推论是充分的还是 必要的,都很可能对解题有帮助。如果从结论能够推导出一 个充要推论,那么实际上我们就将问题进行了一次“双向” 归约,如果原问题不容易解决,那么归约后的问题也许就容 易解决了,通过一层层的归约,让逻辑的枝蔓从结论上一节 节的生长,我们往往会发现,离已知量越来越近。此外,即 便是从结论推导出的必要非充分推论(“单向”归约),对 问题也是有帮助的——任何不满足这个推论的方案都不是问 题的解:譬如通过驻点来求函数的最值,我们通过考察函数 的最值(除了函数边界点外),发现它必然有一个性质,即 在这个点上函数的一阶导数为0,虽然一阶导数为0的点未 必是最值点,但我们可以肯定的是,任何一阶导数不为0的 点都可以排除,这就将解空间缩小到了有穷多个点,剩下的 只要做做简单的排除法,答案就出现了。再譬如线性规划中 经典的单纯形算法(又见《Algorithms》),也 是通过对结论的考 察揭示出只需遍历有限个顶点便必然可以到达最值的。此外 很多我们熟知的经典题目也都是这种思路的典范,譬如《H ow To Solve It》上面举的例子:通过一个9升水的桶和一个4升水的 桶在河里取6升水。这个题目通过正向试错,很快也能发现 答案,然而通过反向归约,则能够不偏不倚的命中答案。另 一些我们耳熟能详的题目也是如此,譬如:100根火柴, 两个人轮流取,每个人每次只能取1~7根,谁拿到最后一 根火柴谁赢;问有必胜策略吗,有的话是先手还是后手必胜 ?这个问题通过试错就不是那么容易发现答案了。同样,这 个问题的推广被收录在《编程之美》里面:两堆橘子,各为 m和n个,两人轮流拿,拿的时候你只能选择某一堆在里面 拿(即不能跨堆拿),你可以拿1~这堆里面所有剩下的个 橘子,谁拿到最后一个橘子谁赢;问题同上。算法上面很多 聪明的算法也都是通过考察所求结论隐藏的性质来减小复杂 度的,譬如刚才提到的单纯形问题,譬如经典面试题“名人 问题”、“和最小(大)的连续子序列”等等。倒推法之所 以是一种极为深刻的思维方法,本质上是因为它充分利用了 题目中一个最不易被觉察到的信息——结论。结论往往蕴含 着丰富的条件,譬如对什么样的解才是满足题意的解的约束 。一般来说,借助结论中蕴含的知识,我们便可以更为“智 能地”搜索解空间。举一个直白的例子,有人要你在地球上 寻找一栋满足如下条件的建筑:__层高(填空自己填), __风格,__年代始建,... (省略若干约束条件)。对于这样一个问题,最平凡的解法 是穷举地球上每一栋建筑,直到遇到一个满足条件的为止。 而更“智能”的(或者说更“启发”的)方法则是充分利用 题目里面的约束信息,譬如假若条件里面说要60层楼房, 你就不会去非洲找,如果要拜占庭风格的,你估计也不会到 中国来找,如果要始建于很早的年代的,你也不会去非常新 建的城市里面去找,等等。倒推法是如此的重要,以至于笛 卡尔当时认为可以把一切问题归结为求解代数方程组,笛卡 尔的万能解题法就是首先将问题转化为代数问题,然后设出 未知数,列出方程,最后解这组(个)方程。其中设未知数 本质上就是一种倒推:通过设出一个假想的结论x,来将题 目对x的需求表达出来,然后顺势而下推导出x。仔细想想 设未知数这种手法所蕴含的深刻思想,也就难怪笛卡尔会认 为它是那个解决所有问题的一般性钥匙了。
试错。试错估计是世界上被运用最广泛的启发法,你拿到一 个题目,里面有一些条件,你需要求解一个未知量。于是你 对题目这里捅捅那里捣捣,你用上所有的已知量,或使用所 有你想到的操作手法,尝试着看看能不能得到有用的结论, 能不能离答案近一步。事实上,如果一个问题的状态空间是 有限的话,往往可以通过穷举所有可能性来找到那个关键的 性质。譬如这样一个问题:有一个囚犯,国王打算处决他, 但仁慈的国王给了他一个生还的机会。现在摆在他面前有两 个瓶子,一个里面装了50个白球,一个装了50个黑球, 这个囚犯有一个机会可以随便怎样重新分配这些球到两个瓶 子中(当然,要保证不空),分配完了之后囚犯被蒙上眼睛 ,国王随机取一个瓶子给他,他在里面摸出一个球(因为蒙 着眼睛,所以也是随机抽取),如果白球,则活,否则挂掉 。问,这个囚犯如何分配,才能最大化生还几率。结合特例 和试错法,这个题目的答案是很容易发现的。这样的题目还 有很多。实际上,历史上很多有名的发现也都是无意间发现 的(可以看作是试错的一种)。
调整题目的条件(如,删除、增加、改变条件)。有时候, 通过调整题目的条件,我们往往迅速能够发现条件和结论之 间是如何联系的。通过扭曲问题的内部结构,我们能发现原 本结构里面重要的东西。譬如这样一个题目(感谢alai 同学提供):A国由1000000个岛组成,岛与岛之间 只能用船作为交通工具,有些岛之间有船来往,从任意一个 岛都可以去到另外任一个岛,当然其中可能要换船。现在有 一个警察要追捕一个逃犯,开始时他们在不同的岛上,警察 和逃犯都是每天最多乘一次船,但这个逃犯还有点迷信,每 个月的13日不乘船,警察则不迷信。警察每天乘船前都知 道逃犯昨天在哪个岛上,但不知道他今天会去哪个岛。请证 明,警察一定可以抓到逃犯(即到达同一个岛)。通过拿掉 题目中一个关键的条件,观察区别,然后再放上那个条件, 我们就能“感觉”到题目的内在结构上的某种约束,进而得 到答案。
求解一个类似的题目。类似的题目也许有类似的结构,类似 的性质,类似的解方案。通过考察或回忆一个类似的题目是 如何解决的,也许就能够借用一些重要的点子。然而如何在 大脑中提取出真正类似的题目是一个问题。所谓真正类似的 题目,是指那些抽象结构一样的题目。很多问题表面看是类 似的,然而抽象结构却不是类似的;另一些题目表面看根本 不像,然而抽象层面却是一致的。表面一致抽象不一致会导 致错误的、无效的类比;而表面不一致(抽象一致)则会阻 碍真正有用的类比。《Psychology of Problem Solving》里面对此有详细 的介绍。后面也会提到,为了便于脑中的知识结构真正能够 “迁移”,在记忆掌握和分析问题的时候都应该尽量抽象的 去看待,这样才能够建立知识的本质联系,才能够最大化联 想空间。
列出所有可能跟问题有关的定理或性质。这个不用说,我们 在最初学习解题的时候就是这么做的了。
考察反面,考察其他所有情况。很多时候,我们在解题时容 易陷入一种特定的手法,比如为什么一定要是构造式的来解 这个题目呢?为什么不能是逼近式的?为什么一定要一步到 位算出答案?为什么不能从一个错误的答案调整到正确答案 ?为什么这个东西一定成立?不成立又如何?等等。经典例 子:100个人比赛,要决出冠军至少需要赛多少场。
将问题泛化,并求解这个泛化后的问题。刚才不是说过,应 该通过特例启发思考吗?为什么现在又反倒要泛化呢?实际 上,有少数题目,泛化之后更容易解决。即,解决一类问题 ,比解决这类问题里面某个特定的问题还要容易。波利亚称 之为“发明者悖论”,关于“发明者悖论”,《数学与猜想 》第一卷的开头有一个绝妙的例子,可惜这里空间太小,我 就不摘抄了- _-|||
以上是我认为最重要的,也是最具一般性的、放之四海都可 用的思维法则。一些更为“问题特定”的,或更为现代的启 发法,可以参见《如何解题:现代启发式方法》以及所有的 算法书。不过,在结束这一节之前,还有两个有趣的启发法 值得一提:
下意识孵化法。这个方法有点像老母鸡孵小鸡的过程:我们 先把问题的吃透,放在脑子里,然后等着我们的下意识把它 解出来。不过,不宜将这个方法的条件拉伸过远,实际上, 除非能够一直保持一种思索的状态(金出武雄所谓“思维体 力”),或者问题很简单,否则一转头去做别的事情之后, 你的下意识很容易就把问题丢开了。据说庞加莱有一次在街 上,踏上一辆马车的那一瞬间,想出了一个重要问题的解。 其他人也像仿效,结果没一个人成功。实际上,非但马车与 问题无关,更重要的是,庞加莱实际上在做任何事的时候除 了投入有限的注意力之外,其他思维空间都让给了那个问题 了。同样,阿基米德从浴缸里面跳出来也是如此;如若不是 经过了极其痛苦和长时间的思索,也不会如此兴奋。如果你 也曾经花过几天的时间思考一个问题,肯定也是会有类似的 经历的。
烫手山芋法。说白了,就是把问题扔给别人解决。事实上, 在这个网络时代,这个方法有着无可比拟的优越性。几乎任 何知识性的问题,都可以迅速搜索或请教到答案。不过,如 何在已知知识之外发掘出未知知识,如何解决未知问题,那 就还是要看个人的能力了。数学界流传一个与此有关的笑话 :如果你有一个未解决问题,你有两个办法,一,自己解决 它。二,让陶哲轩对它感兴趣。
除了波利亚的书之外,陶哲轩的《Solving Mathematical Problems》也对解题的启发式思路作了极有意义的 介绍,他在书的第一章遵循波利亚的思路从一个具体的题目 出发,介绍了如何运用波利亚在书中提到的各种启发式方法 来对解题进行尝试。总而言之,充分挖掘题目中蕴含的知识 ,是解题的最关键步骤。本质上,所有启发式方法某种意义 上都是为此服务的。这些知识,有些时候以联想的方式被挖 掘出来,此时启发式方法充当的便是辅助联想的手段。有时 候则以演绎和归纳的手法被挖掘出来,此时启发式方法则充 当助探(辅助探索)工具。
一点思考
1. 联想的法则
人类的大脑是一个复杂而精妙的器官,然而某种程度上,人 类的大脑也是一个愚蠢的器官。如果你总结过你解过的一些 有意义的好题目,你会发现它们有一个共同点:没有用到你 不知道的知识,然而那个最关键的、攸关成败的知识点你就 是想不到。所以你不禁要问,为什么明明这个知识在我脑子 里(也就是说,明明我是“能够” 解决这个问题的),但我就是没法想到它呢?“你是怎么想 到的?”这是问题解决者最常问的一个问题。甚至对于熟练 的解题者来说,这个问题的答案也并不总是很明确的,很可 能他们自己也不清楚那个关键的想法是怎么“蹦”出来的。 我们在思考一个问题的时候,自己能意识到的思维部分似乎 是很少的,绝大多数时候我们能感知到的就是一个一个的转 折点在意识层面显现,我们的意识就像一条不连续的线,在 其上的每一段之间那个空档内发生了什么我们一无所知,往 往我们发现被卡在一个地方,我们苦思冥想,然后一个知识 (也许是一个性质,也许是一个定理)从脑子里冒了出来, 或者说,被我们意识到,然后我们沿着这条路走一段,然后 又卡住,然后又等待一个新的关键知识的出现。而至于这些 知识是怎么冒出来的?我们可以对它们的“冒出来”提供怎 样的帮助?我们可以在意识层面做一些工作,帮助我们的下 意识联想到更多重要的知识吗?那些灵光一现的瞬间,难道 只能等待它们的出现?难道我们不能通过一些系统化的步骤 去“捕获”或“生成”它们?又或者我们能不能至少做些什 么工作以使得它们更容易发生呢?正如金出武雄在《像外行 一样思考,像专家一样实践》中所说的,人类的灵感一定是 有规律的,认知科学目前至少已经确认了人类思维的整个物 质基础——神经元。而既然它们是物质,自然要遵循物质的 运行规律。只不过我们目前还没有窥破它们,但至少我们可 以确信的是,它们在那里。事实上,不需要借助于认知科学 ,单单是通过对我们自己思维过程的自我观察,也许就已经 能够总结出一些重要的规律了,也许,对自身思维过程的反 观真的是人有别于其它动物的本质区别。《专注力》当中有 这样一个例子:一天夜里,你被外面的吵闹声叫醒了,你出 去一看,发现有一群人,其中有一个人开着很名贵的轿车, 他跟你说他们正在玩一个叫“拾荒者”的游戏,由于一些原 因,他必须要赢这个游戏,现在他需要一块1.5m*1m 的木板,如果你能帮忙的话,愿以一万美元酬报。你怎么办 ?被测试的大多数人都没有想到,只要把门拆给他就可以了 (如果你想到了,祝贺你:-)),也许你会说现在的门都 是钢的,没关系,那你有没有想到床板、立柜的门、大桌子 的桌面之类的?这个问题测试的就是心理学上所谓的“范畴 陷阱”,“木板”这个名词在你脑子里的概念中如果是指“ 那些没有加工的,也许放在木材厂门口的,作为原材料的木 板”的话,那么“木板”就会迅速在你的下意识里面建立起 一个搜索范畴,你也会迅速的反应到“这深更半夜叫我上哪 去找木板呢?”如果你一下就想到了,那么很大的可能性是 “木板”这个概念在你脑子里的范畴更大,更抽象,也许包 含了所有“木质的、板状的东西”。这就是联想的法则。我 们的大脑无时无刻不在对事物进行归类,实际上,不仅是事 物,一切知识,都在被自动的归类。在有关对世界的认知方 面,被称为认知图式,我们根据既有的知识结构来理解这个 世界,会带来很大的优势。实际上,模块化是一个重要的降 低复杂性的手段。然而,知识是一把双刃剑,一方面,它们 提供给了我们解决问题的无以伦比的捷径优势,“砖头是砌 墙的”,于是我们遇到砌墙这个问题的时候就可以迅速利用 砖头。然而另一方面,知识却也是思维的桎梏。思维定势就 是指下意识遵循既有知识框架思考的过程。上面的那个木板 的例子也是思维定势的例子。每一个知识都是一个优势,同 时又是一个束缚。著名的科幻作家阿瑟·克拉克有一句名言 :如果一位德高望重的老科学家说某个事情是不可能的,那 么他很可能是错的。所以,如何在获取知识优势的同时,防 止被知识束缚住,是一门技术。
掌握这门技术的钥匙,就是抽象。在吸收知识的时候进行抽 象,同时在面对需要用到知识的新问题时也要对问题进行抽 象。就以大家都知道的“砖头”有多少种用途为例,据说这 道题目是用于测试人的发散思维的,能联想到的用途越多, 思维定势就越小。实际上,借助于抽象这个利器,这类题目 (乃至更广的一类问题)是可以系统性的进行求解的,我们 只需对砖头从各个属性维度进行抽象。譬如,砖头是——长 方形的(长方形的东西有什么用途?还有哪些东西也是长方 形的,它们都有什么用途?)、有棱角的(问题同上)、坚 硬的、固体、有一定大小的体积的、红色的、边界线条平直 的、有一定重量的... 对于每一个抽象,我们不妨联想还有其他什么物体也是具有 同样抽象性质的,它们具有同样的用途吗?当然,除了抽象 之外,还有“修改”,我们可以在各个维度上对砖头的属性 进行调整,以期得到新的属性:譬如大小可以调整、固体可 以调整为碎末、棱角可以打磨、重量也可以调整、形状也可 以调整... 然后看看新的属性可以如何联想开去。
除了这个简单的例子之外,我们也不妨看一看一些算法上的 例子,同样一个算法,不同的人来理解,也许你脑子里记得 的是某个特定的巧妙技巧(也许这个技巧在题目的某步关键 的地方出现,从而带来了最令人意外的转折点),然而另一 人个记得得也许是“递归”这种手法,还有另外一个人记得 的也许是“分治”这种更一般化的解题思路。从不同的抽象 层面去掌握这道题目的知识信息,以后遇到类似的问题,你 能够想起这道题所提供的知识的可能性是有极大的差异的。 《Psychology of Problem Solving》的第11章举了这样一个例子:先让被试 (皆为大学生)阅读一段军事材料,这个材料是说一小撮军 队如何通过同时从几个不同方向小规模攻击来击溃一个防守 严实的军事堡垒的。事实上这个例子的本质是对一个点的同 时的弱攻击能够集聚成强大的力量。然后被试被要求解决一 个问题:一个医生想要用X射线杀死一个恶性肿瘤,这个肿 瘤只可以通过高强度的X射线杀死,然而那样的话就会伤及 周围的良好组织。医生应该怎么办呢?在没有给出先前的军 队的例子的被试中只有10%想到答案,这是控制基线。然 后,在先前学习了军队例子的被试中,这个比例也仅仅只增 加到30%,也就是说只有额外20%的人“自动”地将知 识进行了转移。最后一组是在提醒之下做的,达到了75% ,即比“自动”转移组增加了45%之多。这个例子说明, 知识的表象细节会迷惑我们的眼睛,阻碍我们对知识的运用 ,在这个例子中是阻碍问题之间的类比。而抽象,则正是对 非本质细节去枝减叶的过程,抽象是我们在掌握知识和解决 问题时候的一把有力的奥卡姆剃刀。所以,无论是在解题还 是在学习的过程中,问自己一个问题“我是不是已经掌握了 这个知识最深刻最本质的东西”是非常有益的