我曾在《达尔文的危险观念》中提到过,达尔文的那些伟大观念想要引出的是:
地球上的生命经由这种或者那种算法,在上亿年的时间里谱出了一棵布满枝桠的生命之树。
那么,准确来说什么是算法?事实上,这个概念有很多相互抵触的含义,而我取的是最广义上的那种理解。以下内容是我从《达尔文的危险观念》中摘录出来的,略有修改。
是达尔文发现了算法的力量。算法是一种特定类型的形式步骤,只要可以“运行”或者开始具现化,它就能合乎逻辑地产生特定类型的结果。其实,即使是在达尔文时代,算法也并不十分新颖。很多我们熟悉的算数运算,例如进行一个长除法或者结算支票簿,都是算法。另外,像走出井字棋的完美一步,还有按字母顺序排列单词时使用的那些判定程序,它们也属于算法。数学和逻辑学界对算法的本质和威力的理论反思出现得则相对较晚,它们是20世纪发展的产物,让我们开始重新认识达尔文的发现,直接关系到了计算机的诞生,而计算机的出现也让我们对算法的威力有了更加深刻、更加生动的理解。
要查看算法的词源,我们得向前追溯:经由拉丁文的algorismi到早期英语的algorism,之后又错写为algorithm的现代形式。再往上,算法这一术语其实得自于波斯一位数学家M?usa al-Khowarizm的名字,他在9世纪写过一本关于算术步骤的书,到11世纪,巴斯的阿德拉德(Adelard of Bath)或是切斯特的罗伯特(Robert of Chester)把它译成了拉丁文。数个世纪以来,算法这个概念表示的一直都只是那种万无一失甚至略显“机械”的程序过程,20世纪30年代,阿兰·图灵、库尔特·哥德尔还有阿隆佐·丘奇(Alonzo Church)这一代人经过了一系列创始性的工作,才多多少少确立起了如今人们对这个概念的一些理解。对我们来说,算法的概念有这样三个至关重要的特征,其中每一个总结起来都有些难度:
(1)底层中立:不管你用的是哪种符号体系,也不管你用的是铅笔还是钢笔,纸张或是羊皮卷,霓虹灯或者空中文字,它们都不会影响到你运算长除法的过程。运算程序依据的是逻辑结构,各种物质材料的因果力量也许能为运算保驾护航,但它们不直接参与运算。
(2)潜在无头脑:过程的整体设计可以非常华丽,结果也可能十分耀眼,但算法的各个既成步骤,包括步骤之间的过渡却出奇地简单。有多简单?一个听话的白痴或者是一个简单的机械装置就能执行。教科书中这样说:算法就像是为新手厨师设计的烹饪说明。一本写给主厨的料理书上可能多是这样的措辞:“放入葡萄酒适量,将鱼煮熟。”而转换成算法之后,它会变成这样:“取一瓶标签上写有‘干’字样的白葡萄酒,用螺旋开瓶器打开,把瓶中的酒倒入锅底至3厘米深,然后打开锅下的燃炉旋钮调到高火,……”整个过程分解得相当仔细,最后都落实到一个个简单得不能再简单的小步骤上。你只需要充当一部食谱阅读器就可以了,不需要做出什么明智的决策或是精准的判断,也不需要发挥直觉。
(3)结果有保障:不管什么样的算法,只要不出意外,它就能每次都按照同样的步骤运作。一种算法就是一份简单的、不易有出入的食谱。
显而易见,计算机就是靠这些特点成就的。每一种计算机程序都是一套算法:根本的组成元素是一些简单的步骤,它们的运行过程惊人地可靠,而运行机制却十分简单。电子电路是计算机常用的选料,虽然电子总是在硅芯片上飞来飞去,但计算机的能力却与它们的因果特性完全无关,运算速度除外。同样的算法,用在使用光纤分流光子的设备上就可以完成得更快些,而通过人力用纸和笔来计算就会变得很慢很慢。
达尔文发现的不是一种算法,而是一大类相关的算法,只是他还没办法对这些算法做出明确的划分。