数学与编程有什么关系?[关闭]


89

我刚刚获得了软件开发文凭。现在,我们从基本的Java开始(例如,您可能会说到底)-很好,除了知道如何在Java中做“ Hello World”之外,我没有编程经验。

我一直听到数学与编码有关,但是怎么回事呢?哪些通用示例可以说明数学和编程如何结合在一起,或者相互依赖?

我很抱歉我的问题含糊不清,我几乎还没有对作为代码猴子学生进入的那种世界有一个大概的了解...



25
@Dave,这就是为什么我在评论中提供链接,而不是作为答案。
SK-logic

7
@FiascoLabs不仅如此-语言结构和逻辑也是数学的子领域。编程不过是应用数学。
SK-logic

19
无关紧要的是,以Java开头并不是“从底部开始”。
Matt H

5
@ CharlesE.Grant,许多数学系学生都做同样的事情(并且仍然通过了考试)。
SK-logic

Answers:


137

首先,我是一名数学家-专业的数学家(因为我因做数学而得到报酬)。我不是程序员。我做了一些编程工作,但非常肯定是关于《货物崇拜》品种的(请参阅对https://tex.stackexchange.com/q/451/86的第一条评论和我的回答),而通常没有什么可以使我对此感兴趣的。网站(实际上,我在TeX聊天室中看到指向该链接的链接后,就在此处注册发布此答案)。

我的答案摘要是:数学就是编程

最近,我不得不向一群非数学系的学生讲授数学课程。他们是编程部分。我认为这太棒了!最后,我将能够向已经了解基本概念并且已经具备进行数学基础工具包的人们教授数学。当我问其中有多少人实际编写了程序并得到0到1之间的答案时,我感到非常失望。

在继续之前,我应该澄清一些事情。有些数学领域与编程直接相关,与评估算法和对语言等进行分类有关。我不是在说那些。还有一个程序正在尝试将所有数学转换为可以由计算机评估的正式语言。这有点接近我在说的内容,但是即使专注于此,也会错过我要说的主要内容。我所从事的数学和我所从事的编程与主题几乎完全无关。它们之间的连接处于不同的级别。

我要开始的地方是对主要问题的评论:

如果那是在做数学,那么所有人类活动都是数学的一种形式。如果真是这样,那么数学一词就没有什么用处,因为它不能用于区分一项活动和另一项活动。

是的,那是在做数学。但是“算术”仍然是一个有用的词,因为正如这首歌所说,“这不是您要做的,而是您做事的方式。” 我要说的是,当我以数学方式接近事物时,我正在做数学。有时,这就是“硬核”数学:制定定义,证明定理。有时并非如此。有时,它正在编写愚蠢的小程序,以便我的孩子可以学习他们的拼写单词。

这是我编程时数学可以帮助我的:

  1. 抽象这可能数学中最重要的可转移技能。我的意思是剥离所有不必要的东西并专注于重要属性的能力。

  2. 观点如果我只能选择所有学生都将要学习的件事,那就是:改变观点以适应问题的能力。我们通常在线性代数中使用基变公式(这会导致可怕的矩阵和可怕的并发症)来处理这一问题,但它比这更适用。从本质上讲,就是这样一种想法,即仅仅是因为某种东西已经以一种方式呈现给您,而不必一定是您使用它的方式。这将事物本身的观点与呈现方式分开。这可能是非常实际的:所有事情都是关于使有用有效的东西。如果我有一个向量列表,将它们存储为x坐标列表和y坐标列表更有效,那就这样吧

  3. 形成与功能从上面的领导上; 如果一件事物可以用多种不同的方式呈现,那么说一个特定的呈现就是事物就不再公平。要再次错误引用的那首歌:“这是不是你是什么这是你做了什么 ”的事项。

我可以继续,但是那些就是我想到的。

现在,对我到目前为止所写的内容可能会有很多(负面)反应。一个将是“那不是数学,那是很好的感觉。” 我在上面提到我的话时(或不好的意思)同意“所有人类活动都是数学形式”的观点。另一个将是“这不是问题中所指的数学类型。” 几乎可以肯定这是事实,在这里,我实际上对那些说“至少我十年没有动过数学”的人表示同情。他或她错了,当然,他们从事数学已有10年了,因为每当他们编写程序时,他们都在从事数学。他们只是没有意识到。

我确实在程序中使用了一些“真实数学”。我最近编写了一个有趣的3D形状浏览器,其中涉及使用一些数学运算来找出必须应用于数据的投影和其他变换。我很高兴发现自己实际上在编码四元数!但是,当然,与我工作时的数学相比,所涉及的数学是微不足道的。那是“信封背面”的东西。那种数学,然后我同意您在需要时选择它的感觉,如果您需要比Wikipedia上复杂的东西,那么您会找到真正的数学家来为您做。但是,为了能够在需要时将其拾起,则需要学习一些知识。那东西可能不是您实际使用过的任何东西,但是了解到某些东西使您在以后的生活中实际使用的东西变得更加容易。所以这就是我不同意Coder的地方:如果您要使用任何数学,则确实需要学习一些数学,并且需要从数学的角度进行学习(顺便说一句,这并不意味着证明定理)。

最后是“数学就是程序设计”。通过成为一名优秀的程序员,您可以学到所有这些东西。而且,如果您已经学到了这些东西,您会发现数学容易得多,因为您会理解,当我们谈论向量空间中的向量时,它只是该类的一个实例,Vector这意味着我们可以做所有的事情Vector来该实例:加,减,缩放等。 这就是为什么我会爱教数学的程序员。但是,说作为一个数学家,我要说的是,第一其中的“抽象”在数学中比在编程中容易学习,因为数学是对抽象的追求。每当我们看到某种行为时,我们的训练总是会问:“使它以这种方式表现的那件事是什么?如果我拿另一种相似的东西,会以同样的方式表现吗?那件事有多少?我必须为此而失去才能停止那样的行为吗?” (将其极端化将导致“ cent数学”-搜索该词)。但是我们不对(现实的)“现实世界”对象(无论它们是什么)执行此操作,而是对已经抽象的对象执行此操作。

这已经持续了很长时间,所以让我以经典的数学家笑话之一结束:

数学家和物理学家都参加了有关24维空间的新模型的研讨会。之后,他们进行了讨论,物理学家说:“那真的很难。我的意思是,一个人如何可视化24维空间?” 数学家对此回答:“哦,这很容易。只需将n维空间可视化,然后将n =24。”。


新增2012-03-2

关于这个答案有很多评论,表达了各种观点。现在,主持人已删除了这些内容,我理解我会尽量将它们合并(或回应)到我的答案中。

但是,我不确定是否可以。阅读这些评论以及本页上的其余内容,我只能得出这样的结论:对数学的真正含义存在巨大的误解。而且,我没有足够的能力来解释它。幸运的是,已经有人链接到洛克哈特的《哀叹》,所以我将解释推迟至此。尽管我可能会有所不同(随着我在科学环境中的成长,我会更加强调数学的实验性质),但我认为我无法将其更好

我仍然认为我可以添加一些内容。还有误解为数学什么,也有误解,以什么“做数学”的意思。我看到两种几乎矛盾的立场:

  1. 数学是关于方程和公式的。因此,由于Wikipedia的存在,因此无需研究(这几乎是Euler对Diderot提出的伪性挑战的反面)。

  2. 数学是关于定理和定义的。因此,无需进行研究,因为程序永远不会证明任何东西(这与...在这里插入最喜欢的谬误一样完整)。

虽然这两种立场相互矛盾,但它们最终都在同一个地方:程序员学习任何数学都是没有意义的-可以肯定的是,不是从数学家那里学来的!毕竟,他们对什么了解什么?程序员真正需要知道的任何内容都可以在Wikipedia中找到,或者抄袭他人。

以上,我将自己描述为“货物崇拜”程序员。我敢打赌,你们中的大多数人都会对自己有个私笑,然后想:“啊,是的,我敢打赌,我知道您的程序会是什么样子。” 你可能觉得有点飘飘然和卓越的(虽然我敢肯定,你觉得不好有关飘飘然的感觉和卓越)。

我在上面描述的是货运崇拜数学。

因此,当我说您应该学习一些数学知识以了解数学的工作原理时,我说这是出于与您看到我写的一些代码完全相同的理由:“您的生活有多轻松?如果您要停止从StackOverflow剪切和粘贴代码,并学到了一些有关如何正确执行代码的知识。”

不过,最重要的是,您应该向数学家学习。为什么这样?这是一个比喻。我最擅长的语言是TeX。(全部说明,真的!)。现在,假设我想了解更多关于TeX的知识,而Don Knuth恰好在城里,并提供了一些有关TeX的教程,这是碰巧的。或者我可以在Wikipedia上阅读它。也许是Perl和Larry Wall,或C#(是正确的选择?)和Jon Skeet。这些人很可能不是最好的老师,但他们一定会以他们所知道的数量来弥补!

那就是数学家。我们是编写实际语言的人,然后编写您使用的库。当然,你不知道如何证明一个定理-你不打算写一库!但是,如果您对我们的想法有所了解,那么它可能会帮助您理解为什么我们以这种方式编写该库,并且如果您知道它可以帮助您更好地利用它。

在Wikipedia上查找方程式和证明Poincaré猜想之间有一个中间立场,正如-提到洛克哈特的哀叹-在“我对艺术不是很了解,但我知道自己喜欢什么”之间存在一个中间立场。和成为莫奈之间,以及“任何”键在哪里之间?并成为唐·克努斯(Don Knuth)。如果您还在上大学,那么您将有一个很棒的机会向该领域的专家学习,他们出于某种原因愿意花时间向您解释。


我想进一步扩展的另一点是,为什么作为程序员,您不应该害怕学习更多的数学。这不是深度连接,也不是有用性。这是您对计算机编程的能力可以直接帮助您学习数学。我只想提及一些。

  1. 了解变量。许多人被诸如“让我们成为自然数...”之类的简单陈述所迷惑。或“让epsilon> 0”。在数学中的某些地方,记住变量的范围很重要。这些在编程中都是司空见惯的。学习将数学陈述转换为程序,就会发现跟踪内容变得容易得多。

  2. 证明的性质。如果您曾经编写过测试或编写了可供他人使用的程序,那么您将了解证明的核心。当你这样做,你要知道,无论用户将在,你可以处理它(此处插入强制性XKCD参考)。这就是证明!无论 “用户/ Universe”放入什么的演示,该语句都会成立。实验人员会倾向于“如果在正常情况下可以正常运行,那是真的”,但是程序员知道,总有那个孩子会尝试Alt + G + Shift +ÅØÆ只是为了看看会发生什么。

  3. 干。很抱歉把这个给你弄破,但是我们发明了它,而不是你。几千年来我们一直在“不重复自己”。这就是为什么我在书架上有一份Euclid元素的副本,并且它仍然很有用

还有更多。如果我对编程有更多的了解,我会写一本书《程序员的数学》,其目的不是教“程序员应该知道的数学”,而是“每个人都应该知道的但为程序员优化的数学”。 。但是我可能永远不会对编程知识有足够的了解,除非有人愿意与我合作!


我会留在那里。如果我想的更多,我可能会改变自己写的东西。希望我能更好地解释。在几个月的时间内,我什至可能会不同意其中的一部分。如果有人希望进一步辩论,或以其他方式发表评论,最好不要在此处的评论中这样做。 你知道在哪里找到我


19
这是我在SE上读过的最好的答案之一。顺便说一句,还有就是 “数学程序员”的宏伟书; 它被称为“ 具体数学”,由TeX的作者Donald Knuth共同撰写。我刚得到一份副本,这太棒了。我感觉像你的逆向;当我意识到理解数学课中概念的最佳方法(编写对我来说)是编写一个程序为我完成时,我就对编程很认真。当然,那时候我想使用程序而不是手工进行死记硬背,我的数学老师不喜欢。
杰森·刘易斯

杜德,+ 100。
巴里·布朗

2
只是为了投票赞成而注册
leo

究竟。如果没有数学教给您的分析思想,您就无法做好程序。
Fiasco Labs 2012年

1
有没有关于编程数学的好书(从数学角度看编程)?
2014年

27

它们并没有那么紧密的联系。对于编程而言,了解数学非常重要,尤其是与算法性能相关的分支,但是简单的事实是,没有数学分支会告诉您Singletons是一个糟糕的主意,例如,还是什么时候应该优先考虑继承而不是合成,或者您是否真的需要这种灵活性,而不是重复自己,以及其他数十种核心编程需求。

数学也许能够表达您的程序的功能,但是它绝对不能告诉您最容易维护,最易读和可行的方法。


6
1)单身人士本身没有什么问题,2)算法信息论,形式语言和指称语义与由于某些原因而您如此关注的那些简单事物直接相关(它们对编程的重要性不大)一般来说)。
SK-logic

19
那时您的经验一定会受到限制。只要是域模型的一部分,单例是必要且不可避免的。而如何建立领域模型是一个数学问题,仅此而已。是的,那些对形式语言理论一无所知的人正在产生可怕的模型和可怕的语言。
SK-logic

10
@dave:这种方法的危险在于,无论多么愚蠢,任何人都可以通过陈述一个截然不同的立场来使您偏离明智,合理的立场。求平均值并不能替代评估论点。
Michael Borgwardt'2

4
@ SK-logic:你们两个有可能只是在谈论“单身”到底是什么的不同概念吗?在我看来,SK-logic谈论的是抽象思想,即在系统中仅具有某个实体的一个实例,有时这正是所需的。不幸的是,这个抽象概念与使用公共静态工厂方法的糟糕的实现细节紧密相关,因为GoF本书以此为例说明了如何访问这种Singleton。
Michael Borgwardt'2

5
请不关主题重新Singtons讨论
mattnz

20

数学和编程以两种方式关联。

一种是数学可用于推理计算机程序。它可以帮助回答诸如“随着输入数据的变化,我的程序的运行时间将如何变化?”,“是否保证我的程序能找到问题的答案?”,“我的程序是否尽可能有效?”之类的问题。 ”,“我应该如何重新安排程序以使其更快或更省内存?”。您通常会在高年级课程中涉及诸如计算理论,算法设计和计算机语言设计之类的主题。

数学与程序相关的第二种方式是使用编程来解决数学问题。这很重要,因为实际上可以将许多“普通生活”问题重铸为数学问题,然后在计算机上解决(也许近似解决)。这些主题几乎在您的所有课程中都得到一定程度的体现,尤其是在离散数学和数学建模课程中。


数学不能帮助您保证程序会找到答案。那将解决停止问题,这是不可能的。
DeadMG

6
@DeadMG对于任意程序都是不可能的。在某些情况下,可以很好地证明给定程序终止或不终止。
吕克·丹顿

6
@DeadMG,这是关于停止问题的常见误解。停止问题并不是说您无法证明某个程序是否停止,而是说没有一种算法或证据可以应用于所有程序来决定它们是否停止。例如见en.wikipedia.org/wiki/Halting_problemprogrammers.stackexchange.com/questions/125882/...
查尔斯·格兰特

啊啊 那是我的错 愚蠢的投票锁定...如果您可以编辑自己的帖子,以便我可以取消投票?
DeadMG

4
@DeadMG,你知道的事实,最典型的编程任务并不需要一个图灵完备的语言,在所有?在其余情况下,几乎总是有专门的暂停证明。
SK-logic

12

数学教育对计算机科学很重要的两个具体示例是:

1)使用关系演算的关系数据库。

关系演算由两个计算组成,元组关系演算和域关系演算,它们是数据库关系模型的一部分,并提供了一种声明式方式来指定数据库查询。与关系代数相反,关系代数也是关系模型的一部分,但提供了一种用于指定查询的更具过程性的方式。

关系代数可能会建议以下步骤来检索提供一些样本书的书店的电话号码和名称:

Join book stores and titles over the BookstoreID.
Restrict the result of that join to tuples for the book Some Sample Book.
Project the result of that restriction over StoreName and StorePhone.

关系演算将形成一种描述性的,声明性的方式:

Get StoreName and StorePhone for supplies such that there exists a title BK with the same BookstoreID value and with a BookTitle value of

一些样本书。

关系代数和关系演算在逻辑上是等效的:对于任何代数表达式,演算中都有等效的表达式,反之亦然。该结果称为Codd定理。

下一个领域是人工智能(AI)和机器学习

有关如何使用它们的示例,请查看udacity的CS 373类:对机器人进行编程

描述:本课程由AI领域最顶尖的专家之一授课,它将教您人工智能的基本方法,包括:概率推理,计算机视觉,机器学习和计划,所有这些都专注于机器人技术。广泛的编程示例和作业将在制造自动驾驶汽车的上下文中应用这些方法。通过视频,您将有机会参观该领域领先的研究实验室,并与在斯坦福大学和Google制造自动驾驶汽车的科学家和工程师会面。

先决条件:讲师将具备扎实的编程知识,所有编程都将使用Python。了解概率和线性代数将很有帮助。

第1周:

粒子过滤器进行汽车局部定位的概率基础

第2周:

高斯和连续概率使用卡尔曼滤波器跟踪其他汽车

第3周:

图像处理和机器学习在传感器数据中查找对象

第4周:

规划和搜索通过A *搜索确定在何处行驶通过动态编程查找最佳路线

第5周:

通过PID控制转向和速度

第6周:

将所有内容组合在一起为自动驾驶汽车编程

第7周:

期末考试测试您的知识


我想这属于AI领域,但是使用该术语时,大多数人会想到天空中的这个馅饼。无论如何,几乎任何模拟现实世界的程序几乎总是需要某种形式的高级数学。同样,任何带有传感器的系统几乎总是需要某种形式的高级数学。
Dunk 2012年

11

对于科学应用程序开发,游戏编程,实时系统,仿真系统以及此类应用程序,确实需要数学。毕竟,编程使用数学和科学来解决问题。另一方面,对要捕获用户信息以将其注册到数据库中的应用程序进行编程,不需要任何高级数学。尽管如此,所有程序员都将从基本数论,代数,基本集论和基本数值分析中受益。

从数学从业者的角度来看,数学(以及许多其他科学分支)中的不同主题可以从编程中受益匪浅。


我同意。我从事大量的企业开发工作,并没有发现自己需要使用大量的高级数学知识,尽管一定会很好,因为它肯定会有所帮助。我要说的是,每个程序员都应该至少学习微积分1。其他类型的程序可能会利用傅立叶变换,统计模型以及3D编程经常使用矩阵的方法。
Makotosan

@Makotosan,谢谢您的评论。但是,数学非常有趣,因为程序员的时间很短,因此最好将精力花在真正提高生产力上。对于那些负担得起的人来说,额外的信息成为一种奢侈品。
NoChance 2012年

我认为数学只是程序所需的领域知识,就像了解财务对Excel开发人员很重要一样。
2015年

9

我认为最重要的是,所使用的思维过程相似性使两者看起来如此相似。

例如,两者都是非常合乎逻辑的。如果您遵循相同的步骤集或相同的公式,则总会得出相同的结果。例如,1+1将始终等于2,并且set a = 1均值a将始终为1(直到您将其设置为其他值)

另一个例子是需要在空间上思考。在数学方面,我发现我经常不得不把数字记在脑海中,并想像自己在做什么。作为一个非常简单的示例,我将分解数学问题,使之13x13成为诸如之类的东西13x10 + 13x3,这对于我的大脑来说更容易使用,因此我需要保持跟踪13x10=130 + 13x3=39,所以130+39 = 169。可视化不可见的事物或将问题分解为较小的问题的这种能力通常应用于编程。

因此,我觉得尽管您不需要具备数学背景,程序中数学定义为使用数字进行计算,但是您确实需要与解决数学问题时所用的思维过程和理解相类似。


一些基本数学是获得该系统的,逻辑的问题解决过程的通常垫脚石。语言结构,再也不是在学校里不再学的东西,也是另一个垫脚石。编译器具有解析器是有原因的,您在解析和关注代码结构方面越擅长,您越有可能编写良好的代码。
Fiasco Labs 2012年

5

我想到目前为止,您已经学会了微积分一些三角学的元素。然后您称其数学。这就像将一条腿称为“人类”。

微积分与编程无关,而与物理和工程紧密相关。您将需要用于游戏引擎的物理学和用于统计分析的微积分。(统计分析带来了更多可以接受的工作)

对于我们而言,微积分更多地是将编程与现实世界联系起来。计算演算是研究这种关系到目前为止有多糟糕的分支。(破坏者:它已经很糟糕了,但是我们可以无限期地对其进行检查

三角函数是盒子里的一个疯狂杰克,当您最不期望它出现时,信号分析音频生成和许多其他东西都取决于它。

走线槽代数101逻辑101,学习帕斯卡尔,莱布尼茨,历史(是的,他几乎发明了微积分,得到了它一半错,牛顿认为,直到这一切开始制作几乎感觉-现在依然设想二进制编码的东西),并巴贝奇和您的许多疑问都会消失。(不过,您对数学的定义将永远改变)


4

编程跨越了许多传统的学术学科。

数学,特别是应用数学,对编程很重要,因为我们要求计算机做的很多事情都是紧缩数字。了解数值方法以及如何有效而适当地应用计算是许多程序员每天要做的事情之一。


4

在这里,我将告诉您一些实际的知识,在解决某些计算问题(特别是在Internet领域)时遇到了数学:

  1. 搜索引擎使用矢量演算来搜索数据。
  2. 矩阵分解可用于很多东西,例如情感分析。
  3. 您需要了解微积分的求和,才能弄清所编写代码的复杂性。
  4. 概率在概率信息检索/搜索中被大量使用
  5. 朴素贝叶斯定理用于预测分析中。
  6. 您需要了解诸如超平面之类的知识,才能获得称为SVM的概念,该概念再次在机器学习中用于解决分类问题。
  7. 您需要了解熵才能进行自然语言处理。
  8. 搜索引擎使用的潜在语义索引/主成分分析在很大程度上依赖于矩阵代数。等等...

3

您的问题是“数学”和“程序设计”都是非常广泛和深入的主题,比任何人一生都可以掌握的知识要丰富得多(毫不夸张)。我本人持有数学硕士学位。在大学期间,与同龄人相比,我似乎学到的越多,知道的越少。感觉是这些年来我是否变得不那么聪明了。当我将硕士学位论文提交给一组教授时,甚至他们中的大多数人似乎对我所学的知识都不熟悉。

同样,我现在是数据库驱动的Web应用程序开发人员。如果将我与从事嵌入式汇编语言编程的人进行比较,您可能会认为我们是两个非常有才华的专业人员,但是即使我们都是“程序员”,我们的专业知识也大相径庭。

随着您对高等数学的学习(超越新生的微积分),您会发现数学为抽象推理注入了一门学科,将在您编程时很好地为您服务。我认为该学科非常重要,因为您在编程时会处理抽象的问题。

当然,在大一编程中,您可能会了解指针算法。您将编写一些简短的程序来说明此概念,并且您对如何驱动计算机的理解将符合您的意愿。但是,了解指针算术如何抽象地工作将使您不擅长在实际程序中使用指针。当需要处理一万行代码混乱并对指针算法进行一些更改时,您将需要能够以非常抽象的层次进行推理,做出战略性决策以平衡对更改影响的各种担忧编码。

作为程序员,您必须权衡代码的“可读性”,代码的性能,所生成程序的易用性以及许多其他问题。您必须能够进行非常抽象的比较,以使这些关注点之间达到平衡。您每天都会进行许多比较。我什至还没有开始进行时间管理。您将抽象地推断出您所做的某件事会影响您按时完成任务的能力的可能性,再一次,您每天都会做出许多会影响您工作的决定。

最后,您必须保持自己的哲学纪律,以便能够吸收新的思想和观念,以便随着旧的方法论和实践的失效而能够继续下去。再一次,您将必须能够评估随之而来的想法,并与您已经知道的内容进行抽象比较。

简而言之,正如我们大多数人所知道的那样,编程与我们大多数人都知道的数学没有太多关系。但是从抽象的角度看,它们有很多共同点。


我特别喜欢“我们大多数人都知道”的部分。这就是我在阅读大多数答案时遇到的困难:“左手”不知道“右手”在做什么。
循环空间

我猜想是“左手不知道右手在做什么”。OP表示,他从Java的“开始”。用Java编程有点像是从五金店用螺栓和木材建造东西,而不是加工这些螺栓并将活树变成木材(这更像是用汇编程序编程)
Rice Flour Cookies

2

数学描述(说)一个立方方程。

一种算法描述了如何求解该三次方程式。

在可由机器执行的方式构造该(或任何)算法是编程

计算机科学是对算法的分析-它的理论时间/空间效率,误差范围等。这可以看作是数学的一个分支。但是请注意,计算机科学和编程实际上不是一回事。如果您想成为一名优秀的程序员,那么拥有计算机科学基础非常重要,因为它可以帮助您更好地设计和推理所开发的算法。但这不是必需的。

一个好的程序员可能不是(实际上常常不是)一个好的数学家,反之亦然。它们是独立的可识别技能。


3
这取决于您的域。如果您只是想成为一名程序员,那么您实际上不需要了解数学。如果您想成为业务的关键部分(在许多领域),那么必须提出解决领域问题的解决方案至关重要。通常,只有具有扎实的数学背景才能得出这些解决方案。您可能不需要成为任何特定数学领域的专家,但您应该知道如何应用各种数学,以便找出哪种数学可以解决当前的特定问题。
Dunk 2012年

2

多年来,我已经在这类论坛上看到很多问题,真正的问题在于发布者对数学的理解不足。例如,任何具有良好代数基础的人都知道,你不能除以零。但是我看到了很多问题,发帖人不理解这一点,后来又不理解错误信息,基本上说“你不能被零除”。我已经看到很多问题,很明显,发帖人不了解基本逻辑。我已经看到了太多的问题,其中布尔代数的概念显然无法理解。

仅仅因为您没有写数学证明或像数学教科书中那样直接求解方程式,并不意味着您不需要了解它们背​​后的概念。顺便说一句,在多年的工作经验中,我从来没有遇到过对数学有深刻理解的程序员。

在某些领域中,您直接使用很多数学,例如游戏编程,统计编程,金融编程和某些嵌入式系统。在某些情况下,系统会为您提供要求中需要的方程式,有时却没有。但是,即使给了方程式,要将这些方程式正确转换为编程代码也需要您了解该方程式的开始。

虽然您可以在基本的CRUD应用程序中仅用基本的代数学习,但大多数更有趣的问题和更高级的工作都涉及数学理解。那么,为什么不从一开始就不深入学习数学来限制自己呢?


2

立即想到两个示例:

函数 -将变换应用于输入变量以产生输出变量的想法深深扎根于数学。将一个函数作为参数传递给另一个函数的想法更是如此。通常,与编程相关的抽象思维概念与数学非常相似。

bitMasks-这种解决问题的通用编程方法至少需要对布尔代数有基本的了解,才能掌握该概念。


1

从程序员的角度来看:数学是编程的一个子集。

编程中使用的数学:

在编程中使用集合(数组,列表,地图等)时,您正在处理数学抽象的现实实现。

不使用数学进行编程:

如果这样做println("Hello World"),则实际上使用一些数学运算来计算屏幕上的位置,字符串的长度等事实实际上是无关紧要的。

使用数学编程:

以编程语言实现数学和物理学使诸如计算机辅助设计之类的事情成为可能。


两者之间既有数学方面的关联,也有编程方面的关联。两者都不是另一个的适当子集。如果您了解更多MATH,您就会知道。让我们绘制一个维恩图,看看是否可以在每个区域找到一个项目。代数与数学有关,与编程有关。面向对象编程的原理并不严格与数学相关,而是抽象,因为数学是一种抽象。离散数学和统计学对程序员都非常有用。对于大多数程序员而言,微积分很少出现,但是30年来我从来没有。
沃伦·P

0

编程通常基于通常是数学模型的模型。

让我们以创建抵押计算器为例。为此,您需要知道什么是兴趣,什么是复合兴趣等等。如果您不了解基础数学,那么其他人必须向您提供该信息。通常,做所有事情都是程序员的工作。不过,如果需要,您始终可以寻求帮助。

数学中有简单的概念,已在编程中广泛使用。例如表达式,方程式,变量,它们在编程中被广泛使用。如果您没有在Math中获得它,那么您可能不是最好的程序员。

拥有强大的数学知识,可以为您提供更多的东西来为您的工作建模。最终使您成为一个更好的程序员。例如,您可能想在一个项目中绘制一个二次方程,这样一来,您就会学到更多东西,因为您数学能力强。或者您编写程序来查找圆的区域,从而为您提供更多体验。

在我短暂的教学生涯中,我发现,如果学生没有数学背景,那么在遇到财务问题时,他们几乎会迷失方向。如果他们对模型迷失了,学习语言本身将变得更加困难,并且说实话非常令人沮丧。


3
某人是否可以解决财务问题,与他们在该领域的能力是否胜任有关,几乎与编程能力无关。我使用信号处理软件,其中包含很多数学知识。我的工作不是做数学,而是将数学家和工程技术人员(不在他们的专业领域中进行编程)产生的东西变成好的软件。因为那是我的领域。
Blrfl 2012年

在大多数实际领域中,两者是分开的:有人拥有模型,而有人必须对其进行编程。所以是的,你是对的。但是,对于要从一开始学习编程的人来说,他们必须了解数学。否则会很困难。他们必须了解变量,表达式和不同的数学属性。我曾与优化团队合作。他们正在研究求解器。如果他们不懂数学,那么他们将永远都不会工作。我从学习的角度回答了这一问题,并且知道他只是一个刚开始学习编程的新手。
Noname 2012年

从学习的角度来看,必须具有数学背景,否则其他人将无法学习。
Noname 2012年

解算器在很大程度上是一个数学领域的问题,这使得我们有理由要对所涉及的数学有所了解才能进行求解。我并不是说编程中涉及数学概念,但是正如@DeadMG在他的回答中指出的那样,过程中有很多非常实际的方面,而数学绝对没有帮助。
Blrfl 2012年

1
@ Birfl,DeadMG有点无知(而且几乎总是错误的)。数学将始终在所有“软”领域提供帮助。心理学很大程度上基于数学。社会学更加数学化。而且在系统设计的情况下,最好不要在语义方面没有很好的背景(这是来自离散数学)的情况下进行操作。编程中没有没有非数学方面。包括GUI设计和CRUD编码。
SK-logic

0

计算机科学的理论基础(不仅仅是编程)本质上是数学的。从可计算性的定义到算法的分析和表达,再到编程语言的规范,所有一切都基于各种各样的数学。请参阅此Wikipedia页面以了解所涉及的数学形式。

实际上,大多数不需要知道是否只需要吊索代码。就应用数学而言,除非您进入一个需要大量数字运算技巧的领域(详细的物理模拟,信号分析,财务分析和预测等),否则您可能不会使用除基本代数以外的任何东西。每天


0

老实说,这取决于您正在执行哪种编程。

如果您要使用某些逻辑制作轻量级的Web应用程序,则可能不需要许多学位需要的更高级的数学课程。如果您要处理的处理器负担更多,那么您将需要更多的数学运算。如果您要从事任何科学领域的工作,那么您真的希望手头有calc参考。

您需要数学的另一个地方是您是否想玩游戏。您想对角移动的第二个位置,您需要开始进行一些仔细的计算,以免最终移动到NE的块时不会加速字符。

就是说,您不一定需要先学习数学,然后再学习编程。学习编程,然后学习一些高级数学是完全有效的。在开始涉足Calc或Trig类之前,我开始进行编码,并且一切都很好。当我确实开始学习高级数学时,我发现编码确实对我有帮助,因为我可以通过在快速脚本中更改变量而不是笔和纸来探索更多的话题。


您肯定需要了解游戏的触发数学和矢量数学。
艾伦B

绝对。不过,我还发现,只要不按时完成任务,编写游戏可以是一种重新学习高中时可能忘记的数学的好方法。
kcunning 2012年

0

我绝不是数学专家!我在HS几何学上做得很好,这对我来说完全是逻辑。我发现编程和几何非常相似。在我看来,布尔逻辑与几何证明紧密相关。

然后,几乎没有什么事情比知道您可以使用模数运算符控制一行中的列数要多。

我强烈赞成这样的想法,即成为一个具有程序员(或同事/顾问)和数学家的好程序员。

显然,如果您很幸运地拥有这两种技能,那就快用吧!


0

简单的答案;数学使你快速。当然,您可以通过google / se / wikipedia解决编码问题,但可以完成足够的数学运算,而无需这样做。信不信由你,经过适当训练的人脑比Google更快。此外,您所掌握的数学知识越多,您就能越快地理解google / se / wiki给您的结果,而您就需要进行深入研究以了解人们的看法。在解决编程问题的过程中,无论如何您最终都会学习数学,但是如果您专注于数学,那将是一个效率更高的过程。

您的问题有点像摇滚乐手在问他们为什么需要正规的音乐训练。没有它,有可能成功吗?当然。如果您这样做的话,它会使您更讨厌吗?绝对。

答案稍微复杂一些-当数学家和程序员使用“解决方案”一词时(对于问题,不是方程式,即不是“根”),它们的含义几乎相同。学习解决数学问题可以帮助您学习解决编程问题。

顺便说一句-并没有针对任何人的冒犯-任何说自己是一个很好的程序员但讨厌数学的人都是大骗子。发生的是,他们被不良的高中生或大学讲师拒之门外,从那时起,他们就觉得自己“不擅长数学”。没有学习障碍的任何人(即,任何能够学习OO语言的人)都有能力完成包括二年级微积分在内的所有事务。


0

数学和99%的编程活动几乎没有共同之处。数学不一定是优秀的程序员。我参加了几门大学水平的数学课程,包括但不限于线性代数的微积分I,II,III元素以及其他一些课程。

我担任软件工程师已有10多年了,几乎不需要使用除基础数学之外的任何东西。有一些需要数学的例外情况:例如图形和其他领域。但是99%的编程和软件工程都不需要数学。它需要逻辑思维,算法,OOP,函数,分解问题等。


0

1)在学习编程时,您会遇到技术术语(即算法)。要分析算法,必须对多项式,对数和指数函数的性质有所了解。

2)在计算机科学应用程序的基础上,必须对离散数学和连续数学有所了解,才能编写出有意义的解决方案。通过学习以下课程,人们可以对此有所了解:

---> 计算机科学数学

---> 通过计算机科学应用程序对矩阵进行编码:线性代数

对于初学者来说,我感觉像python/的动态类型化语言scheme是最适合编程的语言。像Java/ 这样的静态类型语言C++并不是最好的开始。从“麻省理工学院/ UOC-伯克利/斯坦福大学”发行的Opencourseware比普通的大学课程可以为您提供更好的指导。我敢打赌你!!!


-1

我个人要说的是,这取决于所涉及的编程级别。数据模型及其之间的相关性,涉及的编程算法。例如:编写一个输出“ Hello World”的程序,我认为不需要使某人熟悉高等数学。数学参与程度取决于需要以编程方式解决的问题的复杂程度。


-2

仅凭我的经验,不再:
我不是数学家。我不是天才,只是自恋。
...多年后,我意识到自己比直觉更能干

首先,我从零开始学习了Pick(死系统)(仅附带纸质文档和示例),
然后学习了C,有趣的C ++和可工作的Java

如您所言,我可以说学习这种语言不是一个数学问题(即使基本/极简代数对您有所帮助),而是一个逻辑问题。

现在,许多工具(例如Eclipse)可以帮助并纠正您:您只需要专注于您想做的事情,仅需52个保留字...以及许多对您不利的库。

因此,如果您喜欢语言,请选择一个Java项目,研究Pattern Design,UML,了解JVM以及将其与Bigloo和Scala结合使用的方法,并在一万小时内一次又一次地了解。

拥有Java经验可以为您提供高薪工作,并且可以长期从事大型工业项目,并且您将能够切换到其他环境,因为您能够讲信息而不是数学

如果理解语言(单词,含义,概念和其他隐藏的逻辑科学,例如语义,本体论等)对于您的人类来说是一个不错的目标,那么您一生都可以从现在开始

否则,尝试另一种方法。

最好的问候
克劳德


同样,请参见下面的帖子。您正在做数学,只是选择不接受。
jamesson 2012年

1
我看到了,但我发现其他帖子也回答了关于第一个关于数学兴趣的学生的问题(他们知道基础,而不是专业),他们以-1 ^ n讲拉丁语,哲学,语言的逻辑...真实生活。数学的思维是否如此狭窄,以至于所有不处于等式状态的事物都被拒绝了,而又不了解周围的生活,而忘记了牛顿是从苹果的直觉开始的?也许是主持人向其他世界敞开胸怀,在可能的情况下,这将丰富讨论的双方。不管怎样,我会小心谨慎的。
cl-r

-2

有人差点砸了上面的头。编程是数学。更具体地说,编程是数学逻辑的一个分支,称为可计算性理论或递归理论。

数学的其他分支直接涉及,特别是形式语言和自动机理论。这些帮助描述了用于模式匹配的正则表达式,以及用于描述和解析编程语言的形式语法。

任何说编程不是数学的人要么不知道他们在说什么,要么别有用心,例如“知识产权”最大化主义者,他希望通过获得算法或其他一些基本数学上的专利来获利事实或发现。

一些作为数学编程的参考,并且推论不知道您在说什么:

程序就是证明:19世纪逻辑和21世纪计算

程序就是证明:Lambda微积分中的模型和类型

维基百科的Curry-Howard通讯文章

论逻辑在计算机科学中的异常有效性

逻辑的不合理有效性

是的,它们在数学逻辑的“逻辑”部分上很繁重,但通常认为数学是一些公理,其逻辑结果是通过一阶逻辑得出的。

除非另有说明,否则为了赚钱而成为“ IP”最大化主义者:

如何在美国为一种算法申请专利。算法没有专利权,但是通过不将算法称为算法来授予专利权。在网络上发现很多指出或试图解释这种矛盾的材料并不难。


6
-1为结尾。
查尔斯·格兰特

@chars ad hominem针对谁?原始海报?我认为关于专利的观点很有见识(即使可以更好地表达)。
gcbenison 2012年

@gcbenison,“任何说编程不是数学……或别有用心的人”都是典型的自发攻击:我不必回答你的论点,因为你是一个坏人。我觉得这很烦人,因为我不认为编程是数学,而且我认为软件专利是可憎的。我确实拥有应用数学硕士学位,尽管我是否知道自己在说什么肯定会引起争议。
查尔斯·格兰特

@commentators:谢谢。我过去常常忽略这些行为,因为它们是自我推定的苦难归咎于他人。---布鲁斯·埃迪格(Bruce Ediger):怀疑手势反射正在进行中。
cl-r

@ cl-r:我在想一些非常具体的例子,例如SCO反Linux运动和nature.com/news/… 如果我们作为程序员让律师为律师定义数学来造福律师,那么我们对整个文明的发展都是极大的伤害。
Bruce Ediger

-2

数学是编程的一切。例如,在游戏编程中,您需要使用matyhs进行物理处理,并减少所有工作。要在Java中移动玩家的x位置,您可以执行int x = x + speed * deltaTime或,int x = x - speed * deltaTime但是您可能会说这是基本的数学运算,因此让我们进入更高级的内容。有一种对棋手进行评级的算法称为Elo算法。

这是解释的Elo算法

如果您仍然认为这是基础,请尝试一下。当您获得生日,月份和年份时,如何计算某人的年龄。从今年减去出生年份,然后检查月份是否小于该月份,以及是否不减去1。

这不是魔术,而是努力工作和良好的数学。


-4

好的,为此,我可能会得到很多反对意见,但是编程和数学是两个完全不相关的东西。仅仅作为加法,乘法和基本逻辑运算之类的基础知识的人就可以成为出色的开发人员。

大多数开发人员在他们的职业生涯中不会解决一个方程式,并且大O表示法之类的事情也可以通过非数学方式来掌握。您只需要考虑一下这些东西,想象一下您的脑袋里有一些东西在翻转,瞧,如果有人解释了什么日志和功能,您就可以知道这些东西是什么大O。

有时,数学可以简化它,也可以让您为证明自己感到骄傲,因为您可以通过将离散数学等命名为数学领域来扩展编程的含义,但是可以学习许多微分方程和积分,并且如何证明这一点,如果您想以程序员的身份成功,恕我直言并不是最好的主意。

至少我十年没有动过数学,我一直与数学教授争论,当我需要数学进行实时渲染时,我从程序员的角度学到了一切,而没有任何定理证明,并且对我而言,与所有数学教授相比,它变得简单易懂。在这些教授看来,“如果您不懂数学,就不能成为一名优秀的程序员”。当然可以,容易!

我现在了解数学知识,因此我可以与数学背景的程序员讨论所有对数的差异和知识,但这仅仅是出于使他们不会晕倒的原因。因为这些东西在99.9%的时间内都是无用的,所以从程序员的角度来看,它可以被更有效地学习1000倍。

哎呀,程序员至少需要5年才能掌握编程语言+框架+最佳实践。为什么在地球上他们应该学习如何证明定理?数学系学生从事数学工作,程序员使这些工作运行,这就是它的工作方式。


8
一个孩子告诉他妈妈他不需要数学,因为他会长大后成为百万富翁棒球运动员。他妈妈告诉他“您需要数学才能数百万”。
2012年

2
抱歉,我不同意。学习数学可以教您如何逻辑思考。如果您不能逻辑思考,那么您将要编写的只是一堆无法扩展的代码。我并不是说您必须是数学专家,甚至不是数学专家,也不必在日常生活中使用它。但是,如果您想解决实际的编程问题,则需要进行研究。
jmort253

2
@ jmort253:学习数学不会使您成为有逻辑思维的人。它要么是与您息息相关的事物,要么不是。我从学校开始就讨厌数学,但是我很合逻辑。编程不是数学,我从事系统编程已有10年以上的时间,我可以100%自信地告诉您,在进行Web开发或SQL管理时,您可以期望更少的数学。您的任务不是开发新的数学理论,而是要使用最有效的算法和容器,以可维护的方式使用有限的资源来使事物正常工作。
编码员

2
@Nav:对于每个人来说,基本数学运算(包括x和y的方程式)都是有意义的。但是,数以百万计的资产通常是会计师和律师的工作,因为否则,您将错过某些州法律,该州法律必须与声明做一些事情,并以任何方式放松一切。您应该足够聪明,以了解发生了什么事情,但是一旦您擅长于某件事,使用专门的服务将在您保持良好身材的同时正确,快速,及时地为您做事,从而更具成本效益,保持辛苦赚来的前5名。
编码员

10
数学不是求解方程式的过程。如果您所见过的唯一数学是在学校教授的数学,那么您从未见过实际的数学
doppelgreener 2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.