CS61A阅读指南
CS61A阅读指南
写一下关于cs61a课本的阅读指南,方便同志们更高效地阅读cs61a。
为什么要写这个?
初学这些知识的时候,总会觉得自己很努力但是学的不明不白,而且经常会被一些不了解的概念卡住,阅读体验极差☹。
后来在《为什么学生不喜欢上学》和 你有什么值得分享的高效学习方法? - howhowfire的回答 - 知乎里面作者如何规划理科学习的部分,窥探了为什么学的这么痛苦:
学习中的困难,要么源于主动思维过难,超出了学习者能力所及的范围,要么源于主动思维时间过长,超出了学习者意志力的承受范围。熟悉了,才能理解概念,然后运用概念。
根据这本书和知乎大佬的回答,我慢慢摸索到了新手学习cs61a的关键:
- 了解材料涉及的背景知识
- 熟悉材料的结构,理解每一节为什么这么设计的,以及大体设计了什么
- 熟悉材料的代码
在通篇阅读cs61a材料之前,python新手至少需要对上面三个知识点达到了解甚至熟悉的程度,否则零基础阅读文档时会异常痛苦。
而本文就是将1和2涉及的内容写下来,方便新手同志们获得更好地阅读体验。这里从1.6节开始的理由很简单:因为前面的知识很简单,你只需要认真阅读就可以,不需要另外的背景知识作为补充,也不需要提纲挈领统揽全局。
[!IMPORTANT]
本文并不是cs61a的阅读笔记,而是作为新人阅读cs61a材料之前的
导学案
,是为了让同志们更好地阅读cs61a的。这个文章存在的根本原因,就是cs61a的阅读材料默认新人有较强背景知识储备,但是实际上对于我们大一新生来说,很多背景知识(类似于树、链表等数据结构和面向对象的思想)都是不具备的。
我相信在阅读cs61a材料前,先将这篇帖子阅读完并且认真理解了里面涉及到的概念术语,等到开始阅读cs61a的时候,你会感到无比愉悦。
欢迎同志们的讨论和指点!
CS61A 导学案
1.6 函数
- “用户定义函数(user-defined functions)”作为一种数值运算的抽象模式,从而使它们与涉及的特定数字无关
- 高阶函数:用一些函数来表达计算的通用方法(general methods),而且和它们调用的特定函数无关
- 通用方法
def improve(update, close, guess=1)
- 嵌套定义解决帧混乱和参数限制的问题
- 背景:利用平均值近似计算一个数的平方根
- 作为返回值的函数
- 背景:
牛顿法
的概念和具体实现 - 用函数具体实现
牛顿法
的思想:迭代改进算法 - Lambda 表达式
1.7 递归
- 背景:递归函数
- 递归举例
sum_digits(n):"""返回正整数 n 的所有数字位之和"""
- 背景:递归函数的理解
- 理解举例:递归调用时栈帧变化+打印字符
cascade(n)
- 树递归:单个函数进行多个递归调用
2.2 数据抽象
- 概念:为什么要数据抽象?数据抽象的基本思想是?(首先粗略了解,下面案例会帮助理解)
- 举例:有理数的抽象表示-
rational(n, d)
,numer(x)
,denom(x)
。 - 列表的索引
- 抽象屏障的意义:分析上面有理数的抽象表示
- 如何构建一个数据抽象:使用选择器和构造器的集合以及一些行为条件 - 函数
pair
和select
2.3 序列
本节根据序列(数据)的基本属性,自己动手实现一个链表,延伸数据抽象的概念。
-
概念:序列是什么?
-
python内置的序列结构- 列表(list)以及常用方法
-
count(s, value)
:如何遍历序列 -
概念:序列处理。包括列表推导式(提供了从序列创建列表的简单途径)、 聚合(将序列中的所有值聚合为一个值)和高阶函数
-
概念:完美数
-
序列处理实例1:利用list类型,获取从1到n的完美数
divisors(n)
。 -
序列处理实例2:定面积下计算只有整数边长的矩形的最小周长
-
序列处理实例3:高阶函数来寻找完美数
至此,介绍完毕序列相关属性和对应的常用操作,下面介绍如何对序列这样的数据进行抽象
-
概念:什么是有用的序列抽象?(序列有用的行为包括哪些?)
-
概念:数据的闭包属性
-
概念:树的概念、树递归和分割树
-
树的实例1:代码实现构造函数
tree
、选择器label
和branches
(想要理解函数具体功能,必须提前理解树的概念) -
树的实例2:树递归
fib_tree(n)
,用于构造树;count_leaves
函数计算树的叶子数 -
树的实例3:分割树
partition_tree(n, m)
,返回将 n 分割成不超过 m 的若干正整数之和的分割树 -
概念:链表
-
链表实例1:实现基本抽象,包括
is_link(s)
、link(first, rest)
、first(s)
、rest(s)
。 -
链表实例2:实现满足序列抽象的条件,包括长度
len_link(s)
和数据选择getitem_link(s, i)
,同时介绍了利用递归实现的思路 -
链表实例3:利用递归构造,递增地构造序列。
partitions(n, m)
2.4 可变数据
对象统领函数和数据。这一节开始,就要介绍关于“面向对象”的问题了,所以需要了解下什么是面向对象
-
面向对象编程的核心
-
序列对象“扑克牌”
-
字典概念
-
函数状态:举例取钱函数
withdraw
及其调用过程上面重要的概念就是关于函数的状态,下面紧接着就举例子来实践这个概念
-
可变列表和字典实现:
to_mutable_link(source)
和def dictionary()
-
概念:消息传递。一个函数A中集成了多个函数1、2、3...,调用其中的函数时,用不同的消息区分。这个函数A就利用调度函数(dispatch functions)来操作这些消息,以实现调用内置函数1、2、3...的操作。
-
调度字典的概念和实现
account (initial_balance)
-
约束传递
- 概念
- 例子:华氏温度和摄氏温度之间的关系
9 * c = 5 * (f - 32)
- 实例:实现一个约束系统来换算温度(代码很庞大,需要认真理解,没有捷径)
2.5 面向对象编程
- 用
抽象屏障
和调度字典
介绍。 - 代码
class Account
- 内置函数
getattr
按名称返回对象的属性:getattr(spock_account, 'balance')
- 类名命名规则:CapWords 约定。方法名称遵循使用下划线分隔的小写单词命名函数的标准约定
- 类属性:为
Account
创建名称为interest
的类属性。 - 继承:支票账户
CheckingAccount
是Account
的特化。 Account
类的完整实现CheckingAccount
的完整实现deposit_all(winners, amount=5)
:将 5 美元存入每个帐户列表- 多继承:
SavingsAccount(Account)
- ``AsSeenOnTVAccount(CheckingAccount, SavingsAccount)
:取款和存款都将产生费用,分别使用
CheckingAccount和
SavingsAccount` 中的函数定义
2.6 实现类和对象
- 使用
调度字典
make_instance(cls)
:将一个类传递给形参cls
。bind_method(value, instance)
:将instance
作为第一个参数插入到函数值中,从而创建绑定方法值make_class(attributes, base_class=None)
:可以响应get
和set
消息,以及new
消息以及init_instance(cls, *args)
函数。- 使用上面的方法重新创建一个
Account
类,一个CheckingAccount
子类,以及为他们各自创建一个实例
2.7 对象抽象
- 字符串构造函数:
str
; repr
函数返回一个 Python 可解释的表达式,该表达式的求值结果与原对象相同- 专用方法:特殊名称会在特殊情况下被 Python 解释器调用
- 复数的直角坐标系(实部和虚部)和极坐标系(幅度和角度)表示
- 实现复数最高等级的抽象:
class Number
:要求数值型对象拥有add
和mul
方法 - 复数的乘法和加法运算规则
- 对复数的数学运算:
Complex
类 - 两个表示复数的类:
ComplexRI
使用实部和虚部构建一个复数;ComplexMA
使用幅度和角度构建一个复数 - 实现算术运算所需要的接口包括四个属性:
real
、imam
、magnitude
和angle
。 @property
修饰符- 泛型函数
Rational
类来精确地表示分数 - 下面的内容有点看不懂,上面的背景知识掌握了后再看吧
2.8 效率
- 树递归函数:计算斐波那契数列中的数字的
fib
函数 count
函数:检查fib
函数被调用的次数- 函数的空间需求:活动和非活动的状态
- 函数
count_frames
:跟踪尚未返回的函数调用次数open_count
- 记忆化(Memoization):
memo(f)
函数提升效率 - 增长阶- 时间复杂度啊!数学论证(头大)以及技能
指数运算
- 增长类别:(上面6的内容得搞懂才能学这个)
2.9 递归对象
- 递归对象概念。
Link
类:__len__
和__getitem__
的定义都是递归的link_expression(s)
:将一个Link
实例转换为一个字符串表达式__repr__
方法- 闭包性质:一个
Link
实例的第一个元素也可以是一个Link
实例 - 函数
count_partitions
(第一章分割数) fib_tree(n)
:Tree
类可以表示 **用于计算斐波那契数的函数fib
** 的 递归表达式树 中计算的值- 有序序列集合节省时间:使集合元素按递增顺序排列
- 二叉搜索树的 集合
- 平衡二叉树
本文作者:上山砍大树
本文链接:https://www.cnblogs.com/shangshankandashu/articles/18046806
版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步