数学在编程中的作用

今晚与几个新认识不久的兄弟们聊的甚High,Ruby的活动让大家聚集起来,这感觉只有Ruby社区才有的这样的温度。 只能再次多谢兄弟们的招待。(为了保密,不公开大家的名字细节了)

回到正题,有兄弟问我数学在编程中有什么作用?我想很多人也会有些这相同的疑问。我站在我个人的角度详细理解分享下我的看法。

十分有用

为了说明这个观点,我想先看下 coding 的本来面目。计算机科学与技术之所以叫计算机科学与技术,说明它还算是一门科学,但又有技术两字,它又是一门工程学科。

计算机科学的发展,数学绝对是基础中的基础,微积分的运用,二进制,布尔运算,闭包的定义等等。计算机的本质,从根本上说是数学知识的运用。

不要忘了,当年计算机的用途,即是为了更快速计算制造原子弹的巨大工作量,据传当时需要三百人三年的计算才能完成。这个故事请搜索冯诺以曼的传记来了解更多知识。

更有意思的一件事是,前二天帮助同事完成的一个全排列的数组生成的问题(这个是为了遍历攻击一个SQL系统,不剧透啦):

给定一个 n 维数组,都是数字,例如 [1,2,3], 全排列其内容,将数字转化为字符串,如结果应该是:

[1,2,3], ['1',2,3], [1,'2',3], [1,2,'3'], ['1','2',3], ['1',2,'3'], [1,'2','3'], ['1','2','3']

共八个结果,对吧?

如何解决?我有一个 “凡事化小,小事化了” 的办法:

我们这样理解这个问题, 本质上,问题可以转化为从 n 个物品中(想像是抽奖),分别取出 0个,1个,2个… 直到n个。将这些可能性结合起来即可得到我们的答案。 这是第一步,凡事化小。

我们继续想,现在的问题即是,如果我们有一个解决方案,可以解决从 n 个物品中抽 m(m<=n) 个,这个问题我们就解决了。好的,继续考虑,如果 m = 0 那该多好,只有一种方案,对吧?同样,m = 1,我们很容易解决,遍历一遍就可以了。 那 m = 2 呢? 不好办了,情况就多了。

然而,我们可以继续分,问题无非就是从 n 个物品中抽 2 了嘛,我们完全可以先抽一个,然后再抽一个。 等等,那也就是说问题又可以分为:

n 中取 1 个, 再从剩下的 n-1 中取 1 个, 加上 n 中找一个肯定不取,然后从 n-1 中取 2 了。

不知道你理解了没? 于是,不断的递归下去,我们最终将问题解决了。化为数学公式,

全排列公式

组合公式

是不是这么多费话不如这个公式清楚呢? 其实公式含义就是如此而已。

又没那么有用

然而,编程终归还是工程学科,工程学科的特点是通过研究与实践各种知识,改良改进相关系统。

编程也即是如此,所以 《编程之美》 也只能是说说而已,绝然没有数学那么美。很多烦细的小事都需要我们去处理。所以,编程环境的配置,各种工具,都印证这个工作的本质。

而我们,也的确被称为 “软件工程师” (Software Engineer),是吧?

从这个角度说,编程中,有些方向很需要数学的支撑,例如,搜索,排名算法,智能学习,还有算法。

而另一个方向,我们只需要快速用工程学思想解决问题而已,例如,我们用最顺手的环境,用我们最强大的 Rails,写着最符合现实场景的代码,完成我们想要的功能。

所以,的确,有时候它没那么有用。问题本来到这里就结束了,但也许某些看客认为这个结局好无聊。所以我还继续问下一问题。

但数学到底是什么?

抽象问题,然后解决问题是它的本质。

二元方程:解决一类有两个值求解的问题。

导数:解决极大值极小值问题。

积分学:解决平滑求值问题。

布尔代数:还记得与或非门吗?这个代数学,布尔发明的时候还不知道要干嘛,有啥用。 后来成为了计算机的基础。

编程的本质即在抽象问题,并解决问题。这两者在这方面是一致的。

所以,如有必要,请重视数学,热爱数学。

发表于 2012.11.10


sxysxy • 2016-09-01 21:33

OIER...->, ->