闲聊:数学和编程的联系

浅谈数学与编程的关系

写这些文字的时候是7.11,估计写完要7.12惹。

在我们学习计算机专业之前,或多或少有人说过类似的话:计算机其实和数学差不多啦!在当时,我作为一个零编程的小白,我信了好吧!

可是,真的如此吗?

数学和编程的确有关系,可两者是有很大区别的。

关于此,我打算瞎jb谈一谈自己的经验吧!

毕竟以前也算是打过比赛吧,现在也算是个合格的计算机入门者。(说实话,每次说的时候不能太那啥,毕竟天上有dalao在看,本蒻苣就不敢bb什么了,太放肆啦hhh)

PS:(这里是牢骚,前排提醒)

是啊,却总有一些人,本事没什么,却天天想着装B,有时候不顾他人感受就说什么什么很容易,这不是欠收拾吗?

你可以看到,上图是今年IMO的比赛宣传。

7月9日,罗马尼亚,克卢日纳波卡

IMO中国国家队开始进行第一天的考试,现在已经考完了。根据李一笑(笑神)的说法,今年估计又凉了,作为国家队中最年轻的队员,他在群里说:今年的国家队其他人不怎么刷题,陈题都不会做,这是题外话。

可能会有点乱,但希望可以继续读下去

以前打比赛的时候,一道道题目像什么?不知道。但我明白只有通过技巧才能做出来。打个比方,就像一个NP问题,寻找答案的过程极为复杂,极为坎坷,弄了这么半天就为了追求一个小小的答案。

扪心自问:这是数学吗?这当然是数学!高深的数学里面好多技巧,那是运用得相当炉火纯青,如果没有技巧和天赋以及长久经验的积累,还以为人人都可以精通数学?说实话,比起其他专业,数学系才是真正的劝退专业,觉得数学系简单,只是老师给分松或者课程水。在这里,如果想了解一下,可以去知乎上搜一下(虽然现在知乎已经贴吧化,天天抖机灵,实属恶心,但是还是有一些正经的答案的)

但是这不完全是数学,一门学问,一门科学,纯粹的奇技淫巧会让它华而不实。很多时候,还是需要脚踏实地的,结实的计算,清晰的思考,严谨的态度,这都是实实在在的。

举个例子,下面这个看似简单的问题,尝试去思考一下

一个三角形中若有两条内角平分线相等,则这一定是一个等腰三角形。

这道题的逆命题十分简单,但倒过来后就颇不容易,当年也曾难倒过一些数学家。

这个记得好像是叫做Steiner-Lehmus 定理来着?不记得了,应该是这样叫的。

总而言之,数学是一个要求你又能力去解决NP问题(通过某些特征做出逻辑判断),又需要足够细致严谨。

不过这不是主题,还有计算机呢。

先不谈其他的,就说说编程吧!

计算机科学范围太广,好多我一无所知,我也是菜B一个,挑一个自己好歹还能说上几句的版块。。。

我还是那种思维:程序=算法+数据结构

就算程序好像很好看,很精致,色彩缤纷,一旦算法和数据结构过于简单空白,也没什么用。为什么?

Programming不是用来搞华而不实的东西的,如果打算做一个华丽、美炸、妹子看了都心花怒放的作品,为什么不用AE做呢?AE比自己用库做出来的好看多了呢,事倍功半可不是什么聪明的选择。。。

数据结构和算法就开始要求内功了。

而数学修养,是programmer修养的一部分,当大量的dynamic programming、图论算法、数论算法,多线程算法、NP完全性等等,像这种东西频繁出现的时候,说实话,如果“修为”不够,这里的“修为”,不是指以前是否学过这些知识,而是在于你有没有数学思想。

而且,在任何过程中,我觉得还是别雷声大,雨点小。我们可以打个赌,找个时间问一下旁边学CS的同学:你会递归吗?

百分之90以上的人都一定会说“明白”,接下来问他一点LCS的初步算法,或者问问他为什么斐波那契数列递归的时候速度如此之慢。或者干脆问他:你能编个小程序帮我计算fibonacci的第60项吗?(干脆痛快hhh)

所以说,我觉得这是学计算机的关键,永远不要认为自己学得够多了,膨胀必死。

正所谓

Stay hungry, stay foolish.

但是,CS和Math有着本质的区别,听我慢慢说来。。。

所谓“高等数学”,并不是研究计算机科学必须的。你可以用计算机来做微积分计算,可是这时候你其实是在做数学工作,用计算机作为工具。你研究的并不是计算机科学。这就像你可以用计算机来设计建筑,但建筑学却不是计算机科学的基础。

计算机是比数学更加基础的工具,就像纸和笔一样。计算机可以用来解决数学的问题,也可以用来解决不是数学的问题,比如工程的问题,艺术的问题,经济的问题,社会的问题等等。

就算是算法,在实际工作中,没有太多的数学基础也可以用(虽然效率会大打折扣)但是也是勉强可以pass滴。

没错,就和上图一样,有时候某些算法的数学原理我感觉读起来都有点自闭。而这些来源于一本“圣经”——算导。

你好,算法

PS:强烈安利一下(溜了)

接下来,我想对数学发下牢骚。。。它的语言实在是有点丢人。(不要打我)

并且,数学所用的语言不像程序语言那样简洁、易懂。

数学的理论很多是有用的,然而数学家门用于描述这些理论所用的语言,却是纷繁复杂,缺乏一致性,可组合性,简单性,可用性。

举一个非常简单的例子。如果你说 cos2θ 表示 (cos θ)2,那么理所当然,cos-1θ 就应该表示 1/(cos θ) 了?可它偏偏不是!别被数学老师们的教条和借口欺骗啦,他们总是告诉你:“你应该记住这些!” 可是你想过吗:凭什么? cos2θ 表示 (cos θ)2,而 cos-1θ,明明是一模一样的形式,表示的却是 arccos θ。一个是求幂,一个是调用反函数,风马不及,却写成一个样子。很让人反感这种设计。

数学的语言不像程序语言,它的历史太久,没有经过系统的,考虑周全的,统一的设计。各种数学符号的出现,往往是历史上某个数学家有天在黑板上随手画出一些古怪的符号,说这代表什么,那代表什么,…… 然后就定下来了。很多数学家只关心自己那块狭窄的子领域,为自己的理论随便设计出一套符号,完全不管这些是否跟其它子领域的符号相冲突。这就是为什么不同的数学子领域里写出同样的符号,却可以表示完全不同的涵义。

语言的设计,不论是任何事物,都必须简洁明了,通俗易懂,

用数学的语言可以写出含糊复杂的证明,在期刊或者学术会议上蒙混过关,用程序语言写出来的代码却无法混过计算机这道严格的关卡。

因为计算机不是人,它不会迷迷糊糊的点点头让你混过去,或者因为你是大师就不懂装懂。代码是需要经过现实的检验的。如果你的代码有问题,它迟早会导致出问题。

仅仅对我个人来讲,在学习CS知识的时候,一些超纲的数学知识我是很感兴趣的。

打个比方,在我自己看高数拉格朗日乘数法的时候,学了一下Jocabian矩阵和Hessian矩阵,重新把牛顿法逼近捡了回来,这是很有用的。(特别在机器学习领域)

PS:机器学习对数学要求还是蛮高的,毕竟现在流行的SVM都是在欧几里得空间里进行模拟的。(非欧空间也有)更不要说抽象代数惹。这是我第一本拿起来看得晕头转向的数学书,看组合数学都没有发生过的事情发生了,真是恐怖。。。

夜深了,该摸鱼了。

欢迎各位和我进行交流,十分感谢!

感谢关注。。。。。。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180712G0U6R700?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 yunjia_community@tencent.com 删除。

扫码关注云+社区

领取腾讯云代金券