看后总结(Introduction to Computer Science and Programming,MIT 600)

       本周由于前一半在忙实验室汇报,后面还带了家教,所以暂时还未完成全部课程学习。不过基本已经学完了,只剩最后两课。现先给出已看课程的总结。

       5月22日更新,已看完所有视频,收获良多,下面的任务是看算法和刷题,总结已更新完毕。个人也做了50多页的笔记,以后还是要温故的。

       总体上,看这个视频花了较长时间。看的是2014版,没有中文字幕,不过语言整体上较为清晰易懂。因为花了大量时间做笔记和编程练习,所以整体上进度较慢。做笔记一方面是总结以便以后查看,一方面也当是练习英语了。演讲人是William Eric Grimson,今天心血来潮查了一下,是个大牛,IEEE,AAAI和ACM fellow,最近几年还当了MIT的校长。讲的内容逻辑很清晰,虽然用的是Python语言,但思想是共通的,把程序设计的主要思想都给涵盖了。有个小缺陷,就是视频里基于的是Python2,用新的Python Interpreter有些地方会报错,需要自己上网查阅修改。

       下面这个视频课程需要注意的几个内容。首先,本门计算机科学和编程入门课程使用的语言是Python,演讲人也给出了原因:语法简单易学,解释型语言(bug容易定位),不用进行内存管理。这样,初学者可以把更多的精力集中于理解思想,而不是浪费在细节上(吐槽下C++)。而且,需要指出的时,随着存储和计算能力的大幅提高,modernstyle programming language都将趋向Python这样的风格,更人性化,而不是为了点内存锱铢必较。其次,本文希望突出的几个重点:系统性,算法及其复杂度,抽象。其中,系统性是指一个人编写,测试,调试代码的整体行为,是一个coder的基本功。而抽象,是演讲者所一直强调的computationalthinking的核心,包括如何将实际问题化简为已有成熟解法问题的集合的形式,如何降低代码的耦合方便日后修改,如何分离实现和使用等。算法及其复杂度则是另一个需要花费大量时间的领域,一个好的算法,能将一个看似复杂的问题解的清晰易懂,对于常见算法的熟知是一项基本功。最后,对于程序设计,递归和迭代的思想很重要,面向对象编程的现代编程风格也是需要仔细理解体会的。

       下文仅给出每节课的总结,按课分类。


2017.05.06  Lesson 1     Introduction to this subject

1. 给出了本节课的目标: 1)善于用计算机实现自己的想法,2)学会computational thinking

2. 介绍了计算机的功能,局限和基本结构

3. 讲述了编程语言的语法(Syntax),静态语义(Static Semantics)和语义(Semantics),与自然语言做对比,并指出编程中可能出错的地方。


2017.05.07 Lesson 2    Introduction to Python

1. 介绍了语言的分类:low level  or high level; compiled or interpreted及其各自特点,指出本课程将采用高级解释性语言——Python

2. 讲述了Python的入门知识:object,scalar object(int,float,bool),表达式(expression),运算符(operator),类型转换,对象—值绑定,non-scalar objects(strings)

3. 介绍了Python的程序,首先介绍了直线程序(straight-line programs)和条件语句(conditional statements)


2017.05.08 Lesson 3  Iteration(迭代)

1. 首先接着上次的if语句,讲述了迭代的概念,并给出了迭代的方法:while和for循环

2. 讲述了循环特性,介绍了十进制整数和浮点数转二进制的方法

3. 讲述了3种求一非负数平方根的方法:穷举法(Exhaustive Enumeration),二分搜索法(Bisection Search),牛顿法(Newton-Raphson)


2017.05.09 Lesson 4 函数(Functions)

1.  指出了循环结构的缺点,并说明还需要一种更为抽象的概念——函数

2.  介绍了Python中函数的定义,函数调用,返回值及优势

3.  说明了模块化设计,建议将函数封装,然后用import在其他文件中调用


2017.05.10 Lesson 5 递归(Recursion)

1. 引入递归函数,并给出递归的数学论证——数学归纳法

2. 给出了几个典型的递归应用:数乘,河内塔(Towers of Hanoi), Fibonacci数列和回文

3. 最后介绍了用global定义全局变量,并告之慎用


2017.05.10 Lesson 6 复合数据类型(Compound Data Types)

1. 本章主要介绍了三种Python中常用的复合数据类型和函数的一些特性。

     1) tuple:有序元素序列,元素类型不限(可混合类型);

     2) list:   基本同tuple,区别在于list可以修改,增减其中元素

     3) dictionary: 无序元素序列,元素为对,其中key要求为不可变类型(即不能为list这类)

2.说明Python中函数为第一类对象,可作为list元素,可用map(C++中函数为第二类对象)


2017.05.11 Lesson 7   测试和调试(Testing and Debugging)

1. 本节主要讲述了代码的testing(确定bug)和debugging(修复bug)

2. 给出了testing的方法:分类并确定testing suite(测试集),并说明了分裂的原则和方法(黑箱,白箱),及进行测试的流程和工具

3. 介绍了bug的分类和debug的技巧

3. 最后花大篇幅介绍了如何用二分查找和print语句 来debug。


2017.05.12 Lesson 8  Exceptions(异常)和Assertions(声明)

1. 说明了excepton的定义和处理方法

2. 讲演了Python处理异常的方法: try, except 语句

3. 介绍了Python中异常的分类;介绍了 else和finally语句,以及raise语句

4. 示范了防错性程序设计,即assert语句的使用


2017.05.18 Lesson 9 Algorithm Complexity(算法复杂度)

1. 提出了复杂度的概念,衡量算法复杂度的方法,并着重介绍了大O记法(关注最差情形的时间复杂度衡量方法)

2. 对常见的大O复杂度进行了详细解读和应用实例,并进行对比


2017.05.19 Lesson 10 Search Algorithms(搜索算法)

1. 首先介绍了解决问题的思路:将复杂问题简化,并用成熟的算法给出方案

2. 确定了在数据结构无序状态下,只能做到线性查找,复杂度O(n)

3. 说明对sorted lists,二分查找复杂度为O(logn),效率很高。是否排序+二分取决于查找的频次

4. 介绍了几种排序算法:选择O(n方), 归并O(n),及哈希O(1)


2017.05.20 Lesson 11 OOP(面向对象编程)

1. 本节重新讲解了object,介绍了OOP,以及用class关键字实现创建类及新类型。

2. 说明了OOP的意义:抽象与封装,分离实现(implemention)和应用(use),及其优势

3. 详述了用class关键字创建新类型,给出了其具体实现的过程

4. 讲述了方法(method,类成员函数)的重载和定义,并举实例说明


Lesson 12为5个人讲述计算机跨学科应用的介绍,跳过


2017.05.21 Lesson 13 OOP and Inheritance(继承)

1. 讲述了类继承体系和替换原则(类成员函数重载,C++中用virtual)

2. 讲演了一个复杂的类继承实例:Person, MITPerson, Grades

3. 介绍了Generators及其意义 


2017.05.22 Lesson 14 Tree

1. 介绍了树的定义,二叉树和树搜索算法:DFS,BFS

2. 讲演了决策树,详细说明了用Python语言和树结构解决背包问题的算法

3. 最后介绍了避免死循环的方法


2017.05.22 Lesson 15 Conclusion

1. 最后一节对本门课程的内容进行了总结,并为未来的学习指明了方向

2. 重申了一下computational thinking: Abstraction,Automation and Algorithms

3. 高度概括了本书的主要内容:1)语言—Python;2)程序(write,test and debug);3)Estimating Complexity;

                                                   4)Abstraction(solve problems with programs); 5)Algorithms

你可能感兴趣的:(公开课程)