- 使用归纳法证明递归算法,
- 形式化正确性证明,
- 函数式语言,
- λ演算,
- 渐近复杂度,
- 确定有限状态自动机、非确定有限状态自动机、图灵机和理论计算等,
- 以及盒子里的所有内容都是二进制的事实。
我知道数学对编程非常重要,但我对这种“子集”观点感到困惑。编程在哪些方面是数学的一个子集?
如果有足够强的联系,我希望得到一个与企业/OO开发相关的解释。
我知道数学对编程非常重要,但我对这种“子集”观点感到困惑。编程在哪些方面是数学的一个子集?
如果有足够强的联系,我希望得到一个与企业/OO开发相关的解释。
从算法等方面需要进行抽象思考时,它属于数学范畴。
当涉及计划时间表、可交付成果、测试时,它是工程。
当你不知道最终结果会是什么时,它就是艺术。
编程是应用数学中最难的分支之一;较差的数学家最好还是保持纯数学家身份。
--E. W. Dijkstra
总的来说,记住数学是逻辑的正式编码,这也是我们在软件中所做的。
你问题中列出的主题都涉及到了数学问题。我们能够在相当高的抽象层次上进行编程,因此原始的数学可能并不会直接显露出来。例如,你提到了DFA...你可以在程序中使用正则表达式而不需要知道任何数学,但是当你想要设计一个好的正则表达式引擎时,你会发现更需要数学知识。
我觉得你碰到了一个有趣的点。编程既是一门艺术又是一门科学。有很多“工具”,而你并不一定需要坐下来做大量高级数学才能简单地编写一个程序。实际上,在你编程时,你可能并没有真正在做很多数学或计算机科学方面的事情。
只有当我们开始解决计算机科学中的困难问题时,数学才会出现。你深入研究的越深入,它就会以更低的抽象层次呈现出来。
还有一些编程领域并不一定需要你工作,但它们涉及更多的数学。例如,虽然你可以学习一种语言并编写一些应用程序而不需要任何正式的数学,但在没有一些应用数学知识的情况下,你无法在算法分析方面取得很大进展。
虽然没有提到编程,但这个想法仍然很相关。
好的,我在大学主修数学和计算机科学专业。如果集合A代表数学,集合B代表计算机科学,那么它们的交集为A intersects B,而不是A是B的子集。
毫无疑问,计算机科学的许多创始人,如图灵和迪克斯特拉等,都是数学家。互联网的大多数创始人要么是数学、物理或工程专业的博士。计算机科学的大部分核心概念来自于数学,但编程本质上并不是数学。数学帮助我们在日常生活中,但两者并不相同。
然而,毫无疑问,计算机最初的设计目的就是进行计算。在这么短的时间内,我们已经走过了很长的路。
1917年,爱因斯坦作为一名著名的数学家而被人们所知。直到广岛事件发生后,普通大众才最终意识到物理学不仅仅是应用数学。
当人们不理解某些东西时,他们会尝试把它视为他们所理解的东西的一种类型。他们通过类比思考。编程曾被描述为数学、工程、科学、艺术、手工艺、建筑等领域。这些都不是完全错误的;编程从中借鉴了各方面的知识。真正的问题是编程领域只有大约50年的历史。人们还没有将其融入到他们的心智分类中。
这里有很多混淆。
首先,“编程”目前并不等同于“计算机科学”。当Dijkstra称自己为“程序员”(更或者说是发明了这个称号)时,他不是简单地制作CRUD应用程序,而是进行应用计算机科学。让我们不要被这个概念混淆-今天,在商业环境中,大多数程序员所做的事情与计算机科学之间存在巨大差异。
现在,可以说计算机科学是数学的一个分支;但正如Knuth所指出的(在他的论文“计算机科学及其与数学的关系”中,收录在他的计算机科学选集中),也可以认为数学是计算机科学的一个分支。
实际上,我强烈推荐这篇论文给任何考虑数学和计算机科学关系的人阅读,因为Knuth将领域划分得非常清晰明了。
但是,回到你最初的问题:对于从业者来说,“企业/OO开发”与数学相去甚远-但这主要是因为操作的较低级别所涉及的严肃数学问题已被抽象化了(通过编译器、操作系统、指令集等)。同样,对于驾驶汽车来说,并不需要先掌握内燃机的高级知识。当然,如果你想设计更高效的汽车......
如果您的数学定义包括所有形式的形式逻辑,而编程仅通过代码中存在的逻辑和计算来定义,则编程是数学的一个子集 QED ;-)
但这就像说绘画只是在表面上涂上彩色颜料 - 它完全忽略了艺术、洞察力、直觉、整个创作过程
有人可能会用同样的推理认为音乐是数学的一个子集
因此,我必须说不,编程不是数学的一个子集。编程使用数学的一个子集,但也需要非数学技能/才能 [就像音乐创作一样]
嗯,撇开这一切,除此以外...!
数学在编程的许多方面都被使用,例如:
我认为编程需要数学才能生存。但我不会说它是一个子集。这就像吹玻璃使用物理属性一样,但这些艺术家不会称自己为物理学家。