`
lifaming15
  • 浏览: 64731 次
  • 来自: ...
文章分类
社区版块
存档分类

讨论:写程序到底需不需要懂数学?

 
阅读更多

写程序到底需不需要懂数学?

数学对于程序设计师来说到底重不重要?!类似这样标题的讨论,在网络上已经不知道被讨论多少次了。

研究所顺利考上的向往已久的资工所,成为名符其实的本科系学生,本以为可以不用再玩数学了,但我发现我错了,是不用再玩那些抽久的高等数学没错,但线性代数、机率统计、离散数学等…用了更多的数学,我想不出来有哪门资工研究所的课没用到数学的。而且你最后的硕士论文要写出来,数学更是不能少的。你以为玩网络不需要数学?大错特错,里面一堆机率统计的东西。电机需要数学吗?当然需要!最基本的傅利叶转换就够搞死你了,所有工科的系所都逃不了数学的魔掌。就算你到了管理学院,会计系要数学、经济系要数学、连心理系有些领域也需要数学。虽然所需要的数学不尽相同,但都在数学的领域里。我开始后悔当年没把数学念好,博士班念到一半念不下去了,其中一个原因是我数学太烂了。


写程序需要数学吗?要看程序的目的?那我们就像讨论一个简单的程序,算出1加到100的总和。


完全以程序结果为导向的人,或是训练有素的程序女/男工,甚至有时连我都会很直觉的写出这样的程序:


int sum = 0;

for (int i=1; i<=100; i++)

sum += i;

上面这个程序片段还算很容易让人一眼就看懂,可是我们明明国中时就学过了这种数列级数的算法了,怎么还会写出上面这么笨的程序呢?


int sum = ((1 + 100) * (100 - 1 + 1)) / 2;或更精简的


int sum = (101 * 100) >> 2;

这个例子已经被说烂了,我们来来看另一个例子,计算1加到10000,奇数和偶数的总和。用循环的话,一样很直觉得就写出来了:

int oddSum = 0;

int evenSum = 0;

for (int i=1; i<=10000; i++)

{

if (i % 2 == 0)

evenSum += i;

else

oddSum += i;

}很简单的程序吧!可是我们稍稍的用我们有12年(国小到高中)的数学背景想一下,你可以写出更精简的程序:

int sum = (10001 * 10000) >> 2;

int evenSum = 5001 * 5000;

int oddSum = sum - evenSum;什么?看不懂?!sum应该知道怎么算出来吧?就刚刚第一个例子是1加到100,现在改加到10000而已。evenSum呢?简单的推理一下,1到10000之间的偶数总和是是2+4+6+...+10000,把它们全部除以2的话会变成1+2+3+...+5000,所以1到10000偶数的总和不就是1加到5000的两倍吗?

1加到5000是:

(5001 * 5000) >> 2两倍就不用除那个2了,所以不就是上面那个算式了吗!


那1到10000奇数的总和不就是全部的总和减掉偶数的总合吗!稍微动一下脑袋,可以让你的程序变得很有效率。怕别人看不懂?是不会加个批注在程序代码里面喔!


相信聪明的你,很容易就可以分析出来这两个例子的两种写法,在效能上迶多大的差异,但这不是我在这里想要表答数学是如何如何增加效率的。我想要表答的是,我们明明辛苦了12年,学了一堆的数学,为什么我们要放弃这样的基本训练?我们笑美国人的数学不好,请问你又用了多少的数学来帮助你的生活和你的工作?学了又不用,那不如从小学开始就分科系好了,不喜欢数学、怕数学的,就选完全用不到数学的科系。


我今天不是要大家在写程序是时钻研那种算法、功式等,去计较那些在现在动不动在2GHZ, 3GHZ,双核心、四核心之下,所省下的那微小的效率。而是你的态度!你宁愿多打一些code,也不愿动一下脑筋,如果你的态度是这样子的话,那也是活得下去啦,不过你的水平就不过如此而已。


你会反驳说,需要用到算法、要讲求效率时,我再去研究一下就好了,干嘛说的很严重似的。今天我们一时兴起,要去爬阳明山,没问题啊,那种程度的山,只要双脚健全走得动的人都能爬。如果换成现在流行的登山步道呢?这需要一点点体力才行。如果你要去爬台湾百岳呢?合欢山的东峰算是最简单的吧?开车到山脚下,穿个好一点的鞋子、好一点的衣服、多一点的体力,也还不是太大的问题。那爬玉山呢?虽然现在爬玉山已经很方便了,连行李都可以请人帮你背,但平常没有一些训练,要爬上去不是那么容易的事。你要站在世界的最高点,去挑战圣母峰,那全世界没几个人办得到,而且办到的人事前可是经过了严格的训练。


你想把自己摆在什么位置?你想要成就到什么样的高度?如果你只想在小小的台湾,在二、三流的公司里,打打项目游击战,赚个还算可以的薪水,那的确,你不怎么需要数学,连软件工程的理论也不太需要,最重要的唬弄客户的技术纯熟就可以了。去年去了101的37楼面试后,我才知道我了不起只爬到阿里山而已,要登上MountainView这座山,我必需十倍努力才行。而这个努力不是我在面试前,看看什么教战手册、写写网络上的考古题我就能够通过的,而是必需把一些数学的训练熟到变成很自然的反应才行。简单的问你就好了啦,上面那个用循环写的1加到10000的那个例子,如果10000改用n的话,那需要多少时间,用大O(big O)来表示。如果你不能很快的推论出是O(n)的话,那你的履历连投都不要投,在37楼问的问题比这难多了,而且你没几分钟的时间可以作答。去年那次,是我第二次后悔当初没把数学学好。


为什么Google会这么重视算法和效率?应该说世界级的大公司都重视,Yahoo、微软、YouTube…,因为你写的程序不是给几十个人、几百个人用而已。而是同一时间有几百万,甚至上千万人使用。一个人慢0.1秒好了,一百万人就10万秒,超过一天耶。浏览一个网页,慢个几秒钟你都不能忍受了,更何况是一天。你说能不计较算法和效率吗?!


你想过什么样的生活是你自己决定的,但你想要当个世界级的软件工程师的话,把学数学就当作是一种修行吧!不要怕没地方用,因为你时时刻刻都可以用到它。当你的修行到了某个程度,要挑战高山,就比别人容易多了。


好好好,不想深入就算了,但你不觉得放弃12年的数学训练很可惜吗?至少花点脑筋用一下嘛~~,大家都多少用一点,软件的水平就会慢慢提升了,你说是吗?

分享到:
评论

相关推荐

    河南省名校联盟2020-2021学年高二上学期期中考试 数学(理) 含答案bychun.doc

    考生在选择答案后应使用2B铅笔涂黑答题卡,如果需要更改答案,需要用橡皮擦干净后再选涂,强调了答案的唯一性和不可逆性。 3. **数学概念应用**: - **对数函数**:第一题涉及对数函数y=log2(x^2-2x+5),求解集合A...

    2021年数学建模国赛C题:解决方案与讨论.zip

    【项目说明】 1、该项目是团队成员近期最新开发,代码完整,资料齐全,含设计文档等 2、上传的项目源码经过严格测试,功能完善且能正常...5、不懂配置和运行,可远程教学 6、欢迎下载,沟通交流,互相学习,共同进步!

    迭代抽象法在《C语言程序设计》教学中的探索与实践.pdf

    《C语言程序设计》教学中的迭代抽象法是一种有效的教学策略,旨在解决学生在学习编程时面临的“听得懂,但不会写”的难题。该方法强调通过不断迭代和抽象化来逐步构建程序,帮助学生理解和掌握编程思维。 迭代抽象...

    数学专业C语言循环结构教学研究.pdf

    因此,教学内容和教学方法都需要围绕这一核心目标进行设计和优化,以培养出既懂数学又精通编程的复合型人才。通过不断探索适合数学专业C语言循环结构的教学方法,可以为这些未来的科学家、工程师和研究人员打下坚实...

    ACM国际大学生程序设计竞赛:知识与入门

    ACM国际大学生程序设计竞赛(ACM-ICPC)是全球计算机科学领域内极具挑战性的竞赛之一。它不仅考验参赛者的算法设计和编程技巧,还涉及到团队合作和时间管理等多方面的综合能力。在这样的背景下,《ACM国际大学生程序...

    C++语言程序设计

    (2)掌握学习的方法,首先将概念搞懂,看书,听老师讲,与同学讨论,如听不懂老师所讲,就必须预习。还可以找参考书看,因为每一本书都有不足,和他的长处。 第二,对一些典型的例子,一定要搞懂,记住,不是叫你...

    C语言程序设计入门学习六步曲

    第三步、改错练习:针对错误的程序进行修改,识别并改正常见的语法错误,如变量未定义、标示符大小写混淆等。 第四步、设计性练习:尝试自己设计简单的程序,锻炼独立思考和解决问题的能力。 第五步、综合性练习:...

    简易的计算器小程序 欢迎下载

    在本项目中,我们讨论的是一个名为"简易的计算器小程序"的应用程序,它是一个由个人开发者编写的计算器软件。这个计算器程序旨在提供一种简洁而直观的方式来进行多种计算操作,适合那些希望快速解决基本数学问题的...

    山西省长治市屯留县高一数学上学期期末考试试题.doc

    题目中提到根据直方图求体重在40~45kg的女生人数,这需要读懂直方图并计算相应区间的频数。 7. **概率论中的事件关系**:事件“甲分得红牌”与“乙分得红牌”是互斥事件,因为红牌只有一个,不能同时被两人获得。...

    易语言好好学习数学题计算源码

    如果遇到不懂的地方,可以尝试去论坛寻找答案,或者参与讨论,提升自己的编程技能。 “SanYe”可能是指该资源的创建者或者是易语言的一个特定版本或特性,这需要我们进一步研究才能确定。不过,这至少表明这个资源...

    2017届高考数学大一轮总复习第十章统计统计案例及算法初步计时双基练61算法初步文北师大版.doc

    虽然高中阶段不深入讨论复杂度分析,但解题时要考虑算法的效率,确保在有限时间内能得到结果。 在复习这部分内容时,考生应该熟练掌握基本算法结构,能读懂并构造简单的算法,同时理解如何将算法应用于实际问题中...

    高中信息技术会考算法与程序设计操作题-PPT.ppt

    这类题目要求考生能够读懂给定的程序代码,并预测其执行后的输出结果。以下为几个示例: - 示例1: `S=30 6 55599` - 分析:此段代码未给出具体的运算规则,但从格式上看,可能是对变量`S`进行某种形式的更新。 - ...

    高二数学第八次月考试题 文 试题.doc

    学生需要读懂程序框图,并理解条件结构的运行逻辑。这是培养学生编程逻辑思维的重要一环。 一元二次方程的根与系数的关系,通过韦达定理来解决,是代数领域的一个重要知识点。了解根与系数之间的关系对于解决更复杂...

    吉林省长春市第二中学2013-2014学年高二数学上学期期中试题 理(无答案)新人教版

    4. **统计学 - 频率分布直方图**:第5题通过频率分布直方图来分析数据分布,要求找出底部周长小于110cm的株数,这需要读懂直方图并计算相应区间的频数。 5. **逻辑 - 命题逻辑**:第6题考查逻辑命题的真假判断,...

    编译原理及实践.pdf

    很明显,发展编程技术的下一个重要步骤就是以一个更类似于数学定义或自然语言的简洁形式来编写程序的操作,它应与任何机器都无关,而且也可由一个程序翻译为可执行的代码。例如,前面的汇编语言代码可以写成一个简洁...

    一个月挑战c++ 电子书

     写到这里笔者也呼吁更多的程序高手们,敲起你的键盘,把你的优秀的经验和思想奉献出来,帮助更多需要的人,毕竟思想是需要的是沟通的,知识是需要的是共享,快乐需要的是传递的。  最后在这里要感谢的是我的家人...

    《一个月挑战C++》 chm格式电子书

     写到这里笔者也呼吁更多的程序高手们,敲起你的键盘,把你的优秀的经验和思想奉献出来,帮助更多需要的人,毕竟思想是需要的是沟通的,知识是需要的是共享,快乐需要的是传递的。  最后在这里要感谢的是我的家人...

    浅谈ACM竞赛 鲜活的事实

    17. **纸上编程**:在纸上完整写出程序,控制每题上机时间不超过一小时,遇到困难时及时打印代码分析。 18. **提交注意事项**:确认题号无误,防止交错题,PC^2系统界面可能导致这类错误。 19. **数学应用**:思考...

    吃透源代码——完整篇

    - **与程序相关的专业资料**:例如,如果阅读的是与气象分析相关的代码,则需要复习高等数学的相关知识。 - **项目文件资料**:包括相关行业的资料(如税务系统的专业资料和法律法规)、项目的各种文档(如需求...

Global site tag (gtag.js) - Google Analytics