向数学家介绍编程


30

我目前是一名程序员,大约16岁,已经将我的职业范围缩小到涉及计算机科学学位或电气工程学位的程度(我知道他们有很大不同,但是这个问题是关于我的朋友的),但是我朋友不太确定。

他对数学很感兴趣,是它非常好,我想他会喜欢编程,但他是不是愿意尝试它(编辑愿意去尝试,但之前从未做过)。任何人都可以给我关于他可以涉足编程的语言或工具的建议(在我假设的合理的基本水平上),以解决数学问题或涉及某种数学。

正如我说他非常喜欢数学,但我认为他会喜欢编程一样,问题是我不希望他被入门级与内存分配等无关的东西所拖延。我知道这很重要,但是重点是我希望他学习一些数学编程知识,然后希望他是否足够感兴趣,可以开始学习编程知识。

编辑: 并不是说他完全不感兴趣-更重要的是他之前没有积极探索过该地区,也许是因为他没有被告知。我不想强迫他做他不想做的事情,我认为这更多的是推动,以便他可以学习编程。如果他不喜欢它-足够公平,我将无法控制并且不想这样做,但是如果他发现喜欢它-这种推动将是正确的事情。


17
您为什么要把您的朋友推向他不感兴趣的方向?
HLGEM 2011年

3
作为记录,与我合作的许多程序员都拥有数学学位。最重要的是,它们还不错。
AngryBird

1
我同意@HLGEM。如果有人将我推向纯粹的理论数学,我会讨厌它。同样,那些想要那种东西的人如果被推向无聊的应用东西,就会讨厌它。
工作

4
从事物的角度来看,您16岁。您不是程序员,而是做过一些编程的学生。您的朋友不是数学家,而是喜欢(并学到了一些)数学的学生。虽然我喜欢@ perl.j的答案,但我认为您可能对此不敢恭维。
乔尔·埃瑟顿

2
@ perl.j:直到某人具有必要的学位以证明其必要的“主要学习领域”作为其不是数学家的证据为止。甚至大学里只有数学专业的人还不是数学家。
乔尔·埃瑟顿

Answers:


60

数学徽标

如果您想使用“类似数学”的语言,Haskell是您最好的朋友(对于您最好的朋友)。您可以轻松地制作新功能,而无需麻烦。这是我可以为您的朋友推荐的最佳语言建议。以下是一些链接:

Mathematica

Wolfram的Mathematica是他可能还有的另一项兴趣。

Mathematica is a computational software program used in scientific, engineering, and mathematical fields and other areas of technical computing. It was conceived by Stephen Wolfram and is developed by Wolfram Research of Champaign, Illinois.

尽管价格昂贵,但值得。以下是一些链接:

演算法

算法对于任何程序都很重要,但是当您的伙伴熟悉某种语言时,您应该从这些算法开始。这里有一些更多的链接:

希望这可以帮助!如果您有任何疑问或反馈,请随时发表评论!顺便说一下,所有这些链接都是为了释放资源。如果您要一本印刷的书,我有几点建议,请发表评论!



2
我是数学专业的学生,​​从数学的角度来看,我可以推荐Haskell很棒。我还喜欢阅读随之而来的一些理论知识,这比大多数语言要多得多。
Theo Belaire

2
如果他学会Haskell的,他可以在以后甚至转移到阿格达,适合于做样张依赖性类型语言。
彼得ç

4
@ SK-logic你怎么能这么说?数学就是学习新的逻辑系统并对其进行推理(别忘了数学家发明了图灵机)。老实说,您会处理数学的人不能处理变量变异的想法吗?我的观点是,要在Haskell中进行像变量突变这样的简单操作,就需要一个存储单子!说起来比than 谐容易x = x + 1
JeremyKun 2011年

2
@Bean,实际上是我对赋值语句的第一个反应(那时我对数学中的原始线性方程式一无所知)。从那时起,我反复看到相同的反应。我特意尝试将函数式编程的概念介绍给那些以前没有编程经验的人,并逐渐转向了当务之急。首先总是很容易,所有这些都是“ WTF?!?” 外观总是从介绍命令式和OOP概念开始。
SK-logic

18

ML家族或Haskell中的函数式编程和语言往往非常适合数学家的思想。


非常真实!无限列表以及所有对数学头脑都很有用的列表。

14

如果他是数学专业的学生,​​那么毫无疑问,他将从事大量的编程工作,如果不是用C ++这样的低级语言编写的话,那么取决于他在做什么,那么他将使用更高层次的,特定于数学的语言(例如MapleMathematica)进行编程。

另外,根据他的研究领域,他可能最终会进行应用数学或静态分析,这两者都将需要大量编程。无论他决定如何,他最好现在就习惯编程。


1
您也可以尝试通过Sage(sagemath.org)将Python潜入他的脑海。
2011年

这是另一种特定于数学的高级语言:math.uiuc.edu/Macaulay2
RyanTM

我建议您只允许他发现编程。当他接触到它,并且肯定会被要求做某件事,要求他用一种特定于数学的语言来做某事时,他会喜欢还是讨厌。如果他喜欢这种情况,那么他将能够选择最适合他的语言。不是您不应该帮助您的朋友,如果没有表现出兴趣,那么您应该放弃它。
Ramhound

12

教他Haskell。您可以像在数学中那样思考这种语言:

  • 函数是将输入映射到输出的东西
  • 根据需要评估材料
  • 类型推断和疯狂的类型系统
  • 方便的语法
  • 伟大的社区(例如在StackOverflow上
  • 单音

我建议您向他展示http://learnyouahaskell.com,这是Haskell的最佳教程之一。


11

作为一个学习数学的人(我拥有纯粹数学的学士学位,并且刚刚获得了应用数学/统计学的硕士学位),后来在我的职业生涯中进一步意识到编程的乐趣/实用性/重要性,我非常感谢这个问题。我希望十年前有一个像您一样的朋友来推动我进行编程。

你们都应该检查欧拉计划。它是什么?

欧拉计划(Project Euler)是一系列具有挑战性的数学/计算机编程问题,这些问题不仅仅需要数学方面的知识来解决。尽管数学将帮助您找到优雅而有效的方法,但仍需要使用计算机和编程技能来解决大多数问题。

尽管这不是针对特定语言的建议,但对于编程入门(特别是如果已经对数学感兴趣的话)将是一个很好的动力。问题开始时非常容易和平易近人,但很快变得非常棘手和/或困难。你们都可能会喜欢的一个很好的挑战和动力。

至于使用哪种语言,我在C ++,R,Matlab和Mathematica方面都有丰富的经验,它们在数学社区中都非常出色并被广泛使用。但更具体地说,我强烈建议学习Python,这对数学非常有用,但对数学的限制却不如其他数学(以防他以后想要更多选择)。使用Python入门很容易,但是有很多东西需要学习。它也是免费的,不同于其他一些。C ++也许也是不错的选择,但从一开始就可能有更多的障碍。


欧拉计画的+2,是要添加的对主要问题的评论,直到我看到您的答案。OP和他的朋友绝对应该在一起。
cobaltduck 2013年

10
  • 对于数学家来说,最大的亮点是算法。您的朋友必须开始使用Python(它友好)实现它们。

  • 像MATLAB这样的数字计算环境将对矩阵处理,函数和数据绘制,算法实现非常有用。


10

这取决于他感兴趣的数学领域。

如果他更喜欢抽象代数或组合数学,那么他可能会喜欢Haskell,因为复杂类型系统允许直接编程各种数学。ATS也可能是一种选择。

我会向推荐入门教程和算法的纯函数数据结构,您了解Haskell的好处

如果他更喜欢矩阵分析,微分方程或动力系统,我建议使用MatlabNumPyOctave。通过Dyalog进行的APL也可能引起您的兴趣;尽管我不会从这开始。在C ++中,数值食谱可以用作算法的良好指南。

如果他想进行统计,那么R是自然的选择。


5

我是数学专业的研究生,计算机科学专业的本科生。我开设了一个名为Math∩Programming的博客,其中探讨了数学在编程中的应用(反之亦然),我不得不承认,我发现计算机科学的大多数非数学方面都比较枯燥乏味,没有灵感(基本上,我反对根据我在行业中的经验,所有进入系统编程的荒谬技巧。

另一方面,在我的博客上,我研究了诸如面部识别(相当多的线性代数),加密方法,图灵机和细胞自动机,预测连环杀手活动的模型,搜索引擎以及许多其他数学概念之类的问题。 。最好的部分是我可以实施这些想法,也可以自己实现!

为了让您的朋友像我们其他人一样热爱编程,发现他是一个真正有趣的人项目。如果不致力于自己发现的漂亮产品,编程方面就不会停留。至于语言,我建议使用Mathematica,Racket(一种非常友好,但仍然功能强大的Scheme衍生物),Python和Haskell。Mathematica可能是最好的,因为他可以有选择地实现自己的数学函数,并使用Mathematica的内置库来完成项目(例如,编写一个计算傅立叶系数的函数,然后使用Mathematica进行其余的分析,例如例如过滤,图像生成等)。甚至诸如集成这样的基本主题也给出了一些引人入胜的项目(不同的正交规则,蒙特卡洛集成,向具有大数据集的机器学习的平稳过渡)。

同样,这里似乎有很多回复来自那些不做数学的人,或者没有使用他们建议用来做数学软件的语言的人。人们之所以推荐Haskell,是因为它尽可能接近类别理论的字面实现,并且非常适合某些基本概念的数学定义。但是,如果您的朋友已经接近您的年龄,那么他就不会在数学上做好分类理论的准备(成熟度在研究生院之前或多或少是无用的,并且非常想教自己),并且作为第一语言,Haskell具有最陡峭的语言建议的语言的学习曲线(也许Prolog更陡峭)。我使用Haskell实现了Javascript编译器,最后得到了非常漂亮的优美代码段,但是对于诸如变量突变之类的直观事情,您已经不得不涉足非同寻常的单子。

Python和Mathematica会更加友好,而Mathematica的学习曲线最浅,这仅仅是因为所有库都打包成带有精美文档的漂亮用户界面(只需按F1键即可)。另一方面,有一本我听说过(但未读过)的书,既提供了到高级数学的过渡又同时介绍了Haskell。它似乎获得了亚马逊的正面评价,因此您可能需要检查一下。如果他想从事行业工作,他可以​​升级到C#和Java之类的语言,但是他更有可能永远不需要进入那个丛林(而且很多行业数学的东西都是纯Matlab编写的)。

但是就像我说的那样,通过正确的项目学习,无论该项目如何,语言都会成为一种快乐。


3

如果您的朋友喜欢正式的逻辑,并发现人工智能很有趣,那么他可能想看看Prolog

使用这种语言,您可以陈述谓词(初始假设,“事实”)和推理规则(“关系”),然后提出问题。

然后Prolog出发,计算出是否只能使用给定的事实和关系来回答问题,如果可以,则告诉您答案。

因此,您说“汤姆是猫”和“所有猫都是动物”,问“汤姆是动物吗?” 然后您会得到答案“ true”。

或者,您可以要求它“列出您知道的所有动物”,然后您将获得单个项目列表“ tom”。

当然,语法要比这复杂一些,但是您可以理解一般的想法。


Prolog令人沮丧地接近一阶逻辑,但实际上是不兼容的,因为它无法区分“未经验证”和“错误”。在某些方面它是一种整洁的语言,但我不会将其推向数学家,而是称之为编程逻辑。
David Thornley,2012年

你不能简单地测试否定吗?
比尔·米歇尔

2

鼓励您的朋友尝试的最好方法可能是让他开始编程,而不必过多考虑他正在编程的事实。

一旦他准备好更多地处理“编程”,您就可以从同一本书开始,并从更数学的基础上学习编程。我目前最喜欢的两本书是:

可以在MIT Press网站上免费查看SICP 。

如果您的朋友数学上很喜欢,Lisp不会遇到任何困难,并且使您不必学习任何特殊语法。我认为Lisp比Haskell更容易学习。


1

我同意Haskell的观点,但从实际角度出发,他还应该在广泛使用的抽象机上学习语言。我的意思是JVM语言或.NET语言。

这些平台上的语言比旗舰语言更有趣。在JVM上,看看Clojure和Scala。在.NET平台上,看看F#。

微软研究院还提供了一种名为c-omega的.NET语言,这很有趣,但这只是一个研究项目。


1

Matlab通常用于数学和科学编程。它是一种基于脚本的语言,不难学习,并且所有内存问题都向用户隐藏。

软件工程和电气工程可以合并为计算机工程。


0

如果您的朋友不愿意尝试编程,那么我不明白您为什么要提出这个问题。我认为成为程序员的关键是愿意学习,如果他不愿意学习,那么编程可能不适合他

话虽这么说,您最好的选择可能是自己创建一个小程序并向他展示。也许让它的某些部分未完成,看看是否可以让他对帮助您完成它感兴趣。我知道,程序背后的算法和逻辑要比编写语法要有趣得多,所以也许尝试让他协助您进行程序的逻辑处理,然后再去编写代码并让他看到结果。

如果他对源代码完全不感兴趣,请向他展示如何编写自己的东西。就个人而言,我认为语言本身并不重要,只要它易于学习并且有大量文档即可。


0

围绕Python建立了一个完整的免费数学库和社区。我将从“ Sage”开始,他应该非常喜欢使用它,并且会偶然地学习Python编程。


0

我认为您应该向您的朋友展示一些不同的变体,例如:

  • C
  • LISP /方案
  • 基本知识
  • 伯恩壳
  • 序言

我认为C和LISP是很好的起点,表明不同的语言可以更好地适合不同的任务。我不相信对所有内容都使用Haskell或Erlang。

用于简单处理器的机器代码(或汇编器)也可能很有趣。我一直很高兴我在第一个C64上开始使用机器代码。(MOS 6510)成年人很难在有限的时间进行“浪费”的动手体验。


我不同意。为什么对数学感兴趣的小孩会被机器代码吸引?为什么是C?汇编假定有关处理器的知识过多。C同样提出了许多要求,这些要求最适合想要学习严肃编程的人:指针,寄存器,作用域,类型。对于这种人的编程的第一个介绍,专注于算法或数学思想(概率,随机性,模拟)的应用的东西要好得多。Python,Lisp / Forth,Basic甚至。伯恩贝壳?为什么?...
阿萨德·易卜拉欣

0

对我而言,编程从想要“做某事”开始,即“如果……怎么办?” 题:

  • “我想建立自己的网站”,因此了解HTML等。

  • “我讨厌每次访问时都必须单击X或在此网站上看到Y。难道没有办法使它自动化吗?” 因此,您将了解小书签或编写浏览器扩展。

  • “我想对我的所有音乐进行分类,而我见过的任何工具都无法按照我想要的方式进行分类”,因此您将学习数据库。

  • “我想跟踪我的数学俱乐部的费用”,因此您将了解电子表格,编程宏甚至数据库。

为了使驱动器真正存在,潜在的问题必须来自。我会尝试找到要解决的问题,然后选择一种工具/语言/系统,使他可以对解决方案进行自动化/编程。


-2

我认为,Haskell和Mathematica是必经之路。大多数函数语言也适用于数学。Python也很好,请查阅数学文档

此模块始终可用。它提供对C标准定义的数学函数的访问。

这些函数不能与复数一起使用。如果需要支持复数,请使用cmath模块中的同名函数。由于大多数用户不想学习理解复数所需的数学知识,因此区分支持复数的函数和不支持复数的函数。通过接收异常而不是复杂的结果,可以更早地检测出用作参数的意外的复数,以便程序员可以首先确定如何以及为什么生成它。

此模块提供以下功能...

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.