《初等算法》中文版

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/larryliuxinyu/article/details/51231864

公元9世纪,也就是是中国唐朝的时代,在阿拉伯文明的中心——巴格达,有一位来自东方的大学者刚刚完成了一本著作。书名叫做《还原与对消的科学》(Kitab al-Jabr wa-l-Muqabala)。它讲述了如何解二次以内的方程。人们用这本书的拉丁文简称Al-Jab,创造了一个词Algebra。1859年,李善兰与英国传教士伟列亚力创造性地将其翻译为“代数”。

遗憾的是,没有人知道这位侨居在巴格达的数学家的真正名字。人们只知道他来自一个名叫花剌子模的东方国家。感谢金庸先生,《射雕英雄传》让这个国家的名字得以普及。如今的乌兹别克斯坦的撒马尔罕,还立有这位数学家的雕像。于是来自(Al)花剌子模(Khwarimi)的人,Al-Khwarimi(阿尔-花剌子密)就成了这位数学家的名字。它的拉丁文译法为Algorithm,中文译作“算法”。

我们的前辈在发展代数时,大约经历了三个阶段:文辞代数,简字代数、和符号代数。早期的解方程方法,如花剌子密著作中的方法,使用详细的文字描述解题的步骤,直到16世纪,文辞代数仍然是主流的代数描述手段。后来古希腊的丢翻图,逐渐使用了一些符号简记方法,发展了简字代数。现代的符号代数在莱布尼茨时达到了顶峰。极大了提高了数学语言的严谨性和表达能力。

可是反观我们现在的算法描述和很多计算机语言,似乎仍然停留在文辞代数阶段。这一想法是我在2013年时逐渐形成的。那时距离开始写作《初等算法》一书,已经过去了好几年了。

2005年前后,我经过一番曲折的道路,从C++的template meta programming,经由Lisp方言Scheme,开始使用Haskell来试着编写程序。这是一门纯函数式编程语言,往往引导使用者用“代数”的方式思考和解决问题。但是深入下去,我发现需要解决一个问题。Dijsktra说“程序=算法+数据结构”。大量的已有算法和数据结构都是用命令式的描述和实现的,我们需要发展一套函数式的算法和数据结构。从那时起,我开始试着用多种语言实现《算法导论》一书中的算法。2009年的时候我把这些工作放到了github上,希望更多的人能从中受益。

幸运的是,已经有前人认识到这一问题了。卡耐基梅隆大学的Chris Okasaki在读博士的时候,就发展出了很多函数式数据结构。他的博士论文后来出版成为一本书《Purelyfunctional data structure》。其中用Standard ML给出了一系列的实现。牛津大学的Richard Bird出版了《Pearlsof functional algorithm design》针对很多问题,给出了对应的函数式算法。

站在这些成果的基础上,我得以把一些常见的基本算法整理出来,同时给出命令式和函数式描述,方便大家对照参考。书中给出了一些例子代码,包括Haskell,C, C++, Python,以及Lisp方言Scheme的。

2014年夏天的时候,这本书的英文稿大部分完成了。我接受了一些朋友的建议,开始将其译为中文。到2016年4月的时候,中文版也基本完成了。它们在github上可以获得:

https://github.com/liuxinyu95/AlgoXY/tree/zh-cn

最近几年,我的思路发生了一些转变。从2013年开始,我逐渐开始读一些和数学相关的书籍,开始是一些趣题集,后来是一些数学家的逸闻趣事,和科普读物。偶尔也看看范畴论(Categorytheory)。我逐渐认为计算机科学,以及算法终究还是数学的一个分支。回顾读书期间,我们的数学教学也许忽略了一些东西,例如帮助学生了解数学的历史,培养趣味性和幽默感等等。

如果再次重写《初等算法》这本书,也许不需要放入那些例子程序。而是可以加入更多数学元素,突出一下趣味性。如果有时间,我打算给中小学读者写一本名叫“Unplug”的书,不插电,不用电脑,不编写程序来解决生活中的问题。

当然,也有另一个可能,就是为了迎合主流的读者,将这本书用Scala和Java 8重写一遍。不过未来无法预测,很多时候,我们像布朗运动中的分子,只是迈着“醉汉的脚步”不断前行。

阅读更多
换一批

没有更多推荐了,返回首页