计算机科学与应用英文,离散数学及其在计算机科学中的应用(英文版)

课程动机与目标

很多学院与大学都开设了离散数学这门课程。上这些课程的学生来自多个学科,其中最多的是来自计算机科学的学生。由国家科学基金会支持,作为达特茅斯(Dartmouth)学院跨学科数学项目的一部分,我们提出创建一门离散数学课程来直接解决计算机科学学生的需求。计算机科学的学生需要知道哪些离散数学知识?为什么需要知道这些知识?关于这两个问题,我们的看法如下。

第一,我们认为一些知识对于计算机科学很重要,但是传统的离散数学课程常常不会透彻地讲授这些知识。这些知识包括:递归树和解决递推关系的主定理,计算平均运行时间和分析随机算法的概率理论,以及强归纳法和结构归纳法。

第二,我们认为对于计算机科学的学生而言,那些重要的离散数学知识在计算机科学里对应着一些颇有启发性的问题,并且只具备一两门计算机科学入门课程水平的学生也能够理解。这样有可能回答一届又一届学生在应用数学课程中的疑问:“为什么我们必须学习这个?”因此,我们选择写一本针对计算机科学学生的教科书,为他们提供必要的数学基础,并且通过他们在起步阶段就能够理解的计算机科学问题来启发学习兴趣。

在计算机科学系,离散数学通常是学生的专业首选课之一,甚至是第一门计算机科学课程的先修课。在这种情况下,教师面临着两难困境:是讲授纯数学概念,几乎不涉及计算机应用,还是讲授计算机科学的例子,从而营造一种针对计算机科学学生的教学环境。第一种讲课方式让学生们抱怨在学习第一门计算机科学课程之前,被迫学习太多“不相干的”数学。第二种讲课方式让教授们(通常是数学家)尝试给可能从来没有写过程序的学生解释相当高级的计算机科学知识,比如散列、二叉树和循环程序等。即使在最好的情况,这种方法也明显降低了数学的深度。我们的分析产生了一种不同的讲课方式,创设一门出现在学生稍后学习过程中的课程。尽管我们不强制要求学生已经上过微积分,但是我们假定学生了解并且能够熟练使用加和符号、对数和指数函数,因此对于微积分学前课程的内容有很深的了解是很有帮助的。这意味着要让学生在一门计算机科学的导论课程中先了解递归程序,然后再学习这门课。最好可以和数据结构课程一起或者在其之后学习,不过我们会通过例子解释书中所使用的数据结构,因此数据结构不是这门课的先导课程。

我们觉得这样安排离散数学这门课程有几个优势,下面列举几个特别的例子:

学生已经有了较为深入的问题求解、算法和代码的经验。

学生已经学习过或者在准备学习一些重要的计算机科学概念,比如散列、递归、排序、搜索以及基本的数据结构。

学生已经知道足够的计算机科学知识,包括一些启发性的例子,或者其他容易理解的简单例子。例如:

m散列可以用于启发关于概率的学习。

m分析递归程序(比如并归和快速排序)可以用于启发关于递归关系及其解决方法的学习。

m在寻找队列中最小元素的过程中,分析我们期望多久找到一个新的最小值,可以用来启发关于期望的线性性质和调和数的学习。

m二叉树可以用来讲解结构递归法,也可以启发作为图的特例的树的学习。

在我们自己的讲课经验中,这门课是算法课的前导,并且学生经常在结束离散数学课程不久后就学习算法。这样,他们会发现自己可以直接使用刚刚学过的离散数学知识。

我们的教育哲学

这本教科书是以教学活动为驱动的,并且包含丰富的练习题。通过对这些活动的解释和扩展,教学素材得以不断充实。对于学生最有效的方法是尝试认真完成学生活动,而先不阅读那些教学活动后面的解释。我们最初设计这些教学活动是想让学生在课堂中以小组的形式来完成,因此,如果需要在课外开展教学活动,建议学生组建小组一起完成。我们采用这种方式来设计这门课程以及这本教材,希望借此帮助学生们养成自己的数学思维习惯。我们仔细研究了本科学生应当怎样学习数学,得到了以下几个结论:

如果学生能够主动发现他们正在学习的是什么(经常被称为“主动学习”),往往比那些被动学习的学生能够更长久地记住这些概念,也更有可能在学习环境之外运用这些概念。

当学生在一个小组中和同学一起学习,而不是在由导师带领的一个更大的班级中时,他们更有可能提出问题,直到彻底理解某个主题。(然而,这一点不总是成立。很多学生需要在小组中感到舒适之后才敢提出的问题,因为他们担心自己的提问会耽误别人的学习速度。我们尝试提高课程中的舒适度,方法是允许学生自由选择学习小组,并且根据出席模式允许或者要求学生在不同的天数后更换不同的小组。)

最后,学生在给别人解释概念的时候能够更有效地组织自己脑中的想法,同时能够熟悉数学语言。

本书内容足够支撑一门四学期学时的课程。在达特茅斯学院,我们使用这本书来上一门快节奏的课程,一周上三天且仅仅上九周,并且覆盖了本书除了最后几个章节和一部分带星号的内容之外的所有内容。

.  证明的作用

我们写这本书的目的之一是给学生们提供一些关于证明的背景知识,在以后的计算机科学课程中,他们将需要理解并且写出证明。我们的观点是用听、看、讨论并且尽量多做证明来学习如何做证明。为了方便讨论,我们需要用一种共同的语言来区分证明的组成成分,并且建立起一个讨论的框架。因为这个原因,书中包含一个关于逻辑的章节,即为学生提供这种语言,并帮助他们反思自己已经看到过的证明。为了使这章的内容言之有物,我们将其放在学生了解一些组合和数论的证明之后。这种方法使得学生能够掌握一些用来阐述逻辑证明的具体例子。我们意识到这不是在离散数学书中常用的顺序。然而,我们发现用具体的例子来处理重要事实的证明,可以使学生理解一些实际的基础知识,否则这些证明看起来就像是罗列很长的推理形式规则。

我们已经把关于逻辑的章节放在数学归纳法章节之前,从而可以用逻辑语言来讨论和思考数学归纳法。

数学归纳法

计算机科学的归纳证明经常使用子问题而不是实际问题的精缩版“小问题”。因此,我们强调强归纳法和弱归纳法,我们也介绍树和图的结构归纳法。我们尝试用学生关于递归的经验来帮助他们理解归纳证明,并且设计基于归纳法的证明。特别是,当开始设计归纳证明时,从一个大问题开始并且把它递归分成小问题,比从小问题开始组成大问题更加有利。

伪代码的使用

我们同时使用文字和伪代码描述算法。对于任何使用Java、C或者C++编过程序的人,伪代码很容易读懂,使用其他语言写过程序的人理解起来也不费力。我们不求给出语法上正确的任何一种语言的代码,而是力求代码的清晰。比如“互换变量x和y的值”,我们会写成“交换x和y”,而不是写成三行的代码。类似的,我们写“如果点i、j和k不共线”,而不用担心详细的计算过程如何处理它。这里有一些本书使用的特别约定。

代码区通过缩进来表示,而没有像许多语言一样使用“begin”“end”或者“{ }”。

for循环写成“for i = 1 to n”来标记变量i的取值范围为从1到n。

如果while之后的布尔表达式取值为真,while循环的主体会重复执行。

repeat循环使用格式“repeat…until”。在repeat和unitl之间的代码最少执行一次,并且会重复执行直到在until之后的布尔表达式取值为真。

if语句可以使用以下任意一个格式:

mif(表达式)代码区

mif(表达式)代码区1 else 代码区2

在第一种格式中,当且仅当表达式为真时代码区执行。在第二种格式中,如果表达式为真则代码区1执行,如果表达式为假则代码区2执行。

数组的下标使用“[]”。

赋值用“=”,而等式比较用“==”。

x递增和递减的缩写用“x ++”和“x ––”。

逻辑操作符“not”用“!”表示,所以“!true”是“false”,当x不小于y时,

! (x

新版中的变化

有一本和本书题目相似且作者相同的书,已由另一家出版社出版,但那家出版社退出了大学教科书市场。Ken Bogart是那本书的主要作者,他在书出版前不久辞世。我们非常怀念他参与准备这本新书的日子。

新版相对于之前版本最明显的更新如下:

上一版书讨论过等价关系,不过只是作为一个集合的划分。等价关系的自反性、对称性和传递性被纳入附录,并且讨论了偏序和全序关系。这本书介绍关系,并且将其作为一个用于关联函数、等价关系、偏序关系和全序关系的概念。书中也解释了为什么自反性、对称性和传递性可以推导出等价关系,而自反性、反对称性和传递性则推导出偏序关系。

本书包含结构归纳法,同时,关于递归和归纳关系的章节已经扩展,并且使用了一些不同的例子。

一些关于递推关系的章节已经被移除或者放在附录中,这些章节证明在递推中去掉下取整和上取整,并将关系的作用域扩展到非同底数幂的数域,主定理仍然有效。我们认为这些内容不利于章节的顺畅,并且需要处理一些大多数学生在这个阶段不需要知道的细节。

在概率一章中增加贝叶斯定理。

增加问题以讲解新的知识主题。

还有一些细小的改变(例如,介绍“乘以x和相减”方法来得到一个几何级数的封闭形式)。

教辅资源

下列教辅资源只针对于符合资格的教师开放。请访问www.pearsonhighered.com/irc或联系当地的Addison-Wesley/Pearson Education销售代表,或者发送邮件到computing@aw.com,以获得关于怎样取得这些资料的信息。本书教辅资源包括:

带有答案的教师参考手册

教学建议

课后作业的答案

课堂练习题

关于如何开展课堂小组练习来活跃讨论的详细资料

幻灯片

致谢

很多人对这本书的最初版做出了贡献。我们要谢谢Eddie Cheng(Oakland University)、Alice Dean(Skidmore College)、Ruth Hass(Smith College)和Italo Dejter(University of Puerto Rico),感谢他们对早期手稿的充满价值的评论。随着本书的不断改进,我们和Neal Young、Pasad Jayanti、Tom Shemanske、Rose Orellana、April Rasala、Amit Chakrabarti以及Carl Pomerance用预备版在达特茅斯学院教授离散数学课程。他们中的每个人都对最后的成品有影响,而且有一些是很大的影响,感谢他们提出的建议。特别感谢Carl Pomerance在他的教学过程中卓有见地和前瞻性的评论。Qun Li是我们开始准备手稿时的研究生助教,正是他使得我们出的所有问题都有了答案!现在提供给教师的答案中,核心部分仍然是他完成的工作。计算机科学系和数学系的其他研究生助教也提供了很大的帮助,在我们教授手稿时,他们了解学生听懂了哪些内容而不明白哪些内容,从而进一步帮助他们解决问题。按照这些助教加入的顺序,他们是S. Agrawal、Elishiva Werner-Reiss、Robert Savell、Virgiliu Pavlu、Libo Song、Geeta Chaudhry、King Tan、Yurong Xu、Gabriella Dumitrascu、Florin Constantin、Alin Popescu和Wei Zhang。我们过去的学生也提供了很有价值的反馈。特别是Eric Robinson读过此书临近出版的版本,并且非常认真地指出了那些难以理解的章节。

我们也要感谢审稿人和出版社的编辑们。以下审稿人提供了很有益的建议:Michael Rothstein(Kent Stat University),Ravi Janardan(University of Minnesota, Twin Cities),Klaus Sutner(Carnegie Mellon University),Doug Baldwin(SUNY Genesco),Stuart Reges(University of Washington),Richard Anderson(University of Washington),Jonathan Goldstine(Penn State University)。Sandra Hakanson是Pearson的销售代表,她首先向Pearson的Addison-Wesley部门推荐此书,并协助我们联系编辑负责人Michael Hirsch。Hirsch同意出版这本书,并且负责整个出版流程,很多改进本书的建议都来源于他。其他对本书的出版做出直接贡献的人有:Stephanie Sellinger(编辑助理),Jeff Holcomb(总编辑),Heather McNally(项目编辑),Elena Sidorova(封面设计)。在Laserwords的Bruce Hobart负责手稿的修改、合并和错误纠正。

每一个作者都想感谢另外两位作者从各自的专业活动上抽出时间花在这本书上,因为的确需要时间来融合不同学科的观点。在国家科学基金会的支持下,我们能够承担这个项目。本科生教学部门的员工在这个项目中展现了他们出色的洞察力,在数学科学的项目构思和整个教学课程的实践中,他们清楚本科生的需求,也了解开展跨学科课程的困难。我们感谢这个项目在本科数学教育和跨学科课程发展中起到的积极作用。

Cliff Stein

Scot Drysdale

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值