数学是一种语言。学习数学为了乐趣,也能掌握一种工具。学习数学首先需要选择一本能让你有阅读乐趣的书。从这种意义上看,我从来不推荐中文教材。这不是源自歧视而源自于经验。
《离散数学》的主要内容
先参考一下美国ACM的2016年版CE(计算机工程)的课程计划里面给出的指引:
- Discrete Structures [30 core hours]
- History and overview [1]
- Relevant tools and engineering applications [1]
- Functions, relations, and sets [6]
- Boolean algebra principles [4]
- First-order logic [6]
- Proof techniques [6]
- Basics of counting [2]
- Graph and tree representations and properties [2] Iteration and recursion [2]
另外,一般而言,还会把离散概率的内容归为《离散数学》的内容。
《离散数学》相关课程
稍微归纳一下以上内容,大致上是这些内容或者这些内容的深入解释出自以下几门课程:
- 集合论
- 近世代数(抽象代数)
- 数理逻辑
- 图论
- 具体数学
不能不说,我们很轻易就能获取这几个方向的优秀教材,但是我们能有一本足够优秀的《离散数学》吗?
离散数学的教学原则
首先强调,离散数学的内容是计算机科学领域中广泛应用的数学,特别是一种针对数据结构与算法的数学。
其次,从教学安排上看,可以独立开设《离散数学》课程,也可以让其他课程覆盖以上内容。
第三,《离散数学》的知识必须强调应用。请注意,不是仅仅强调有用,然后让学生等待以后使用,而是在教学中具体展示每一个知识点的某种特定应用,至少对重点的知识点必须如此。
一些思考或者经验
首先,我们需要思考的一个问题就是,在一门课程中覆盖这么多的知识量,会出现什么问题?不难预知,必然是许多知识点得到无法系统覆盖。比如,如果概率论的内容在《离散数学》中讲授,马尔可夫链必然不会被讲授,也许切诺夫界也不会。又比如,群、环、域的内容如果在《离散数学》中覆盖,你能指望可以讲授多少代数的内容呢?或许有人会说,不对啊,如果你需要进一步学习,那么你可以选修《概率论》和《抽象代数》这样的课程啊。没错,前提是,你有机会选。而且还必须考虑,当一种知识只是简单地入门,其起到什么作用?是否可以达到以上强调的“应用”的作用呢?答案估计是否。那么,这样简单入门的课程达到的目标是什么呢?值得思考、探讨。
从这个意义上看,我是极力反对大学生手捧一本经典《离散数学》进行努力学习的,因为效果甚微。因此,作为一个清醒的且能主动学习的大学生,你需要的是知道《离散数学》的知识体系是什么,然后根据自己的实际情况,选修相关的更专门的课程(《概率论》、《组合数学》、《计算理论》),或者选择某些专门领域的经典教材(《代数》、《数理逻辑》、《图论》)进行自习。如果你做不到这一点,那你就只能接受学数学只是为了学而学,只是从理论到理论(其实也没什么理论)的尴尬局面。通常,这种尴尬不是别人说你尴尬,而是一种你自己都感觉得到的尴尬,要改变这种局面,你需要的是改变自己。
小结
在《CC2013--计算机科学的数学要求》一文中提到,不要让学生感觉学习数学过于困难,不要让数学链拉得太长,因此我们必须对不同的同学给不同的学习《离散数学》的建议。
推荐:(Rafael Pass的Discrete Structure课程讲义,简短实用,基本涵括CS2013 中明确要求的数学知识,供大家参考。
2017年6月17日修订