编程是数学的一个子集吗?

时间:2020-03-06 14:45:49  来源:igfitidea点击:

我已经多次听到,所有编程实际上都是数学的一个子集。有人认为OO从根本上讲是基于数学的,但是除了一些明显的例子之外,我没有得到联系:

  • 用归纳法证明递归算法,
  • 正式的正确性证明,
  • 功能语言
  • λ演算
  • 渐进复杂度
  • DFA,NFA,图灵机和一般的理论计算,
  • 以及盒子上的所有东西都是二进制的事实。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。。

我知道数学对于编程非常重要,但是我在这种"子集"视图中苦苦挣扎。用什么方式编程数学的子集?

我正在寻找一种可能与企业/ OO开发有关的解释,也就是说,如果存在足够牢固的联系。

解决方案

从某种意义上讲,它是数学,需要对算法等进行抽象思考。
当涉及计划时间表,可交付成果,测试时,它就是工程。
当我们不知道最终将如何发展时,这就是艺术。

好吧,除了所有这些……!

数学可用于编程的许多方面,例如

  • 创建高效智能的算法
  • 了解大符号
  • 安全性(例如RSA)
  • 还有更多...我认为编程需要数学才能生存。但是我不会将其称为子集。就像吹玻璃使用物理学的性质一样,但是那些艺术家并不称自己为物理学家。

我要说的是,编程比起第四代语言,它所涉及的数学要少得多。汇编与C#数学息息相关,与其相关。有什么想法吗?

如果我们对数学的定义包括形式逻辑的所有形式,并且编程仅由代码中现有的逻辑和计算定义,则编程是数学QED的子集;-)

但这就像是说绘画只是将有色颜料放在其表面上一样,完全照亮了艺术,洞察力,直觉和整个创作过程

有人可能会说,音乐是同一推理的数学子集

所以我不得不说不,编程不是数学的一个子集。编程使用数学的一个子集,但也需要非数学的技能/才华[非常类似于音乐创作]

总的来说,请记住,数学是逻辑的形式化编码,这也是我们在软件中所做的事情。

问题中的主题列表充满了数学问题。我们能够在相当高的抽象水平上进行编程,因此原始数学可能不会让我们望而却步。例如,我们提到了DFA。我们可以在程序中使用正则表达式而无需任何数学知识,但是当我们想设计一个好的正则表达式引擎时,我们会发现对数学的更多需求。

我认为观点很有趣。编程是一门艺术,也是一门科学。有很多"交易工具",我们不必坐下来做很多高级数学运算就可以简单地编写程序。实际上,当我们进行编程时,我们可能并没有真正在做很多数学或者计算机科学。

当我们开始解决计算机科学中的难题时,数学就出现了。我们越深入,它就会越充实自己..通常以较低的抽象级别进行。

还有一些编程领域,我们不必一定要从事,但它们涉及更多的数学运算。例如,虽然我们当然可以在没有任何正式数学的情况下学习语言并编写一些应用程序,但是如果没有一些应用数学,就不会在算法分析中走得太远。

Programming is one of the most difficult branches of applied mathematics; the poorer mathematicians had better remain pure mathematicians.
  
  --E. W. Dijkstra

好的,我上大学时是数学和CS专业。我要说的是,如果集合A是Math,集合B是CS,则A与B相交。它不是子集。

毫无疑问,计算机科学的许多父亲和母亲都是像图灵和戴克斯特拉这样的数学家。互联网的大多数创始人都是数学,物理或者工程专业的博士学位。计算机科学的大多数核心概念都来自数学,但是编程并不是真正的数学。数学对我们的日常生活有帮助,但两者并不相同。

但是毫无疑问,计算机背后的原始推理是很好地计算事物。在这么短的时间内,我们已经走了很长一段路。

我不相信我曾听说编程是数学的一个子集。甚至我们提供的链接也只是一种建议的编程方法(并不是声称它是数学的一个子集),并且Wiki页面中也存在很多分歧。

编程需要(至少一些)应用数学。数学可用于帮助描述和分析程序以及程序片段。编程与数学有着非常密切的关系,并大量使用它和其中的概念。但是子集?不。

我很乐意看到有人声称自己是有明确推理的人。我认为我从来没有

Just because you can use mathematics
  to reason about something does not
  imply that it is, ipso facto, a
  mathematical object. Mathematics is
  used to reason about internal
  combustion engines, radioactive decay
  and juggling patterns. Using
  mathematics is not doing mathematics.

这是一半的数学,一半的人说话,du。

爱因斯坦于1917年以著名的数学家而闻名。直到广岛,公众才终于意识到物理学不仅仅是应用数学。

当人们不了解某事时,他们会尝试将其理解为一种他们确实了解的事情。他们以类推的方式思考。编程已被描述为数学,工程,科学,艺术,工艺,构造领域。它从所有这些中借用。真正的问题是编程领域只有大约50年的历史。人们尚未将其整合到他们的心理分类法中。

我们所做的一切的基础是数学。

幸运的是,我们并不需要擅长数学本身。就像我们不需要了解物理学来驾驶汽车甚至驾驶飞机一样。

我会说...

这部分是数学,尤其是理论上的数学。想象一下设计高效的搜索/排序/聚类/分配/欺骗算法,这全是数学...运筹帷from,从数论到统计。

这部分是工程。复杂的系统很少能达到理想的性能和可靠性水平,软件也不例外。许多软件开发都是关于面对不可靠的硬件和(人类)人类的鲁棒性。

这部分是艺术。创造性的和特殊的软件设计通常会提出很多很棒的新主意,例如汇编语言,多任务操作系统,图形用户界面,动态语言和Web。

只是我的2 ...

数学+艺术+逻辑

如果我们只想让老板分发设计规范,那么数学就不多了,但是这样的工作根本就没有乐趣...但是,想出如何做事情确实需要数学上的想法,至少是一些事情像抽象,图形,有时是数论资料,并根据问题进行演算。就个人而言,我参与编程的时间越来越多,而我在数学方面也越多。但是,在大多数情况下,IMO可以从图书馆借书并查找需要做的事情的基础知识,但这需要一定的数学知识。

如果我们不了解其背后的数学知识,那么我们真的无法设计"好的"算法。在谷歌搜索只需要你到目前为止。

编程是一个太宽泛的话题。好的软件不仅基于数学(逻辑),而且基于心理学,语言学等。算法是数学的一部分,但是除算法外,还有许多其他与编程相关的事物。

作为一个数学家,我很清楚数学不等于编程,但是解决两个学科中的问题的过程非常相似。

解决更高级别的数学问题需要分析性思维,解决问题的可能方法的工具箱,相关领域的经验以及构造答案的某些形式化方法,以便其他数学家同意。如果我们发现解决问题的一种特别聪明,抽象或者优雅的方法,则可以从数学家那获得荣誉。对于特别困难的数学问题,我们可以分阶段解决问题,并使用所谓的猜想和证明来编纂阶段参数。

我认为编程涉及相同的技能。在编程中,同一套原理适用于解决问题的方法和提出问题的方法。当我们对编程难题有部分解决方案时,可以将其作为个人库的一部分包含,并在以后将其用作另一个更大的问题。这些技能似乎与数学中使用的技能非常相似。

数学与编程之间的主要区别在于,后者在编程的不同学科之间比数学具有更多的共同点。数学的两个领域在表示形式和用于传达该领域的内容上可能非常非常不同。相比之下,至少对我来说,编程结构在许多不同的语言中看起来非常相似。

我们实际上可以说,逻辑证明形式的数学类似于编程-

查看Curry-Howard的对应关系。数学家看待事物的方式可能更多,但是我认为这真是一针见血。

这里有很多混乱。

首先,"编程"(当前)不等同于"计算机科学"。当Dijkstra称自己为"程序员"(或者多或者少发明了这个称呼)时,他并不是在抽出CRUD应用程序,而是在从事应用计算机科学。今天,不要让我们感到困惑,当今,商业环境中的大多数程序员所从事的工作与计算机科学之间存在着巨大的差异。

现在,可以说计算机科学是数学的一个分支。但是,正如Knuth所指出的(在他的《计算机科学及其与数学的关系》一文中,该论文收录于他的《计算机科学精选论文》中),也可以认为数学是计算机科学的一个分支。

实际上,我强烈建议所有考虑数学与计算机科学之间关系的人推荐这篇论文,因为Knuth很好地规划了这一领域。

但是,回到原始问题:对从业者来说,"企业/ OO开发"与数学相差很远,但这主要是因为在较低操作层次上涉及的大多数严肃数学都已被抽象化(由编译器,操作系统,指令集等)。类似地,驾驶汽车不需要内燃机物理方面的高级知识。自然,如果我们想设计一款更高效的汽车。

免责声明:我是一名IT顾问,主要开发门户和体系结构方面的内容。我拥有心理学学位。我从未在大学学习过数学。我把工作做好了。通常很好。为什么?因为我认为我们不需要了解数学(就像"大量"的数学知识一样)来编写代码。我们需要分析性思维,解决问题的能力和高水平的抽象能力。但是数学没有给你。这只是另一门需要类似技能的学科。在处理可用性问题和数据存储时,我的心理学研究也适用于我的日常工作。语言学和符号学也起作用。

但是,等等,只是不要解雇我。我并不是说显然计算机根本不需要数学,在设计加密算法和硬件等时,我们需要真正的数学技能-但是,如果像许多程序员一样,我们只使用中/低级语言(例如C) )或者更高级别的内容(例如Cor Java),它们主要使用预先构建的框架和API,我们实际上并不需要了解傅立叶变换,霍夫曼树或者Moebius条带背后的数学原理……让别人来处理,让我在此之上建立价值。我不是笨蛋。我知道线性算法和指数算法以及数据结构等之间的区别。我只是没有兴趣重写quicksort或者一种新颖的视频压缩技术。

程序设计和纯数学之间的区别是状态的概念。程序是一种使用逻辑(数学)在状态之间进行转换的状态机。用于在状态之间进行转换的实际逻辑通常非常简单,这就是为什么成为数学天才不一定像程序员那样对我们有多大帮助。

The difference between programming and pure mathematics is the concept of state.

看看http://en.wikipedia.org/wiki/Dynamic_logic_(modal_logic)。这是一种数学分析事物随时间变化的方式。同样,Hoare三元组是形式化程序的输入输出行为的一种方式。通过使用一些公理来处理程序的顺序组成以及分配的工作方式,我们可以以数学上严格的方式完美地处理状态随时间的变化。

如果我们知道的数学不​​够,请"发明"一些新的数学来处理我们要分析的内容。牛顿和莱布尼兹做了分析(我认为是微积分)。没有理由不为计算和编程而这么做。

我认为数学!=编程:P

我是一名程序员的部分原因是因为我不喜欢数学。我对数学本身没有任何问题,并且从概念上讲我也很满意,我只是不喜欢手工进行计算。当我发现我可以告诉计算机什么是数学问题并让它为我计算时,毕生的激情和职业生涯诞生了。

根据我的母校的回答,这个问题是math ==编程,因为他们允许我带Intro to C ++来满足我的数学要求。

编辑:我应该提到我的学位是电信,当时只有一个学期的标准文科数学要求。

如果不涉及数字,则不是数学。

有些人可能会尝试将"数学"的定义扩展到与数字打交道之外。但这基本上使"数学"一词毫无用处。如果我们将一个单词的含义扩展到谁知道它的含义为止……我们将无法使用该单词进行真正的交流。

我可以说用数字做事不是数学,而是物理。如果我扩展了物理学的定义。这将是一个错误的定义,但我可以做到。我会错的,但是我仍然会以这种方式定义它。

说编程是数学,或者说做不涉及数字的事情是数学。

简单规则:无数字=非数学

编程是关于使用逻辑的。但是逻辑是数学的超集。

例如,如果A在B内,而B在C内,则A在C内。现在……我们从来没有谈论过数字。我可能在谈论的是我钱包里的硬币,我钱包里的硬币。这是逻辑。逻辑谈论事物。事物可以是数字,但事物也可以不是数字。硬币不是数字。

数学是处理数字的逻辑子集。

如果我们说math = logic,那么...我们基本上已经使术语"逻辑"和"数学"变得毫无用处了。

数学是逻辑的内在。

数学不包含逻辑,而是由逻辑包含

否则的话,可能是一个不好的程序员和一个好的数学家,试图使他自己感觉更好。

没有提到编程,但是想法仍然有意义。

将编程与音乐进行比较也很有趣。无论如何,在英国,由于涉及的逻辑,模式等,有一些基于计算的大学本科课程将根据音乐学历来接受申请人,因为它们应该被视为具有计算能力。

编程最初可能是从数学的一个半子集开始的,但是随着时间的流逝,该领域的日益复杂性已导致编程成为为信息处理和计算创建良好抽象的艺术和科学。

编程确实涉及数学,工程学以及对良好设计和实现的审美意识。算法是数学的扩展,系统工程方面在一定程度上与其他工程学科重叠。但是,无论是数学领域还是其他工程领域,对复杂,灵活但易于理解的抽象都没有相同的需求,可以在许多不同的层次上使用和适应这些抽象来解决不断发展的新问题。

需要有用,灵活和动态的抽象,这首先导致创建功能库,然后创建类/组件库,并在最近几年设计模式和面向服务的体系结构。尽管后者更多地专注于设计,但是它们是对在编程问题和解决方案之间建立高级抽象桥梁的日益增长的需求的一种反应。

由于所有这些原因,编程既不是数学的子集也不是数学的超集。这仅仅是使用数学的另一个领域,它比其他领域具有更深的渊源。

数学是最纯粹的真理形式。一切都源于数学。

阿们