CS61A 结课笔记、感想以及资源
降星驰
2022年08月17日 22:07
收录于文集
共9篇

终于把CS61A 收掉了!!!最后写了一下final test,得分是76,和树有关的东西都扣爆了,扣了18分,最后看了一下是自己都会的题目.....勉强达到了心里的及格分,于是就出来分享一下有关61A的资源,评价,以及知识点了

 

开始分享资料

注意 ·我选择的是sp21版本,因为b站有精译版,而且资料相对比较全

sp21的主页找作业和考试资料 https://inst.eecs.berkeley.edu/~cs61a/sp21/ 课本(英文版,推荐这个)强烈推荐,就算你看过中文版最好也看一遍,和中文版是有不一样的,而且可以锻炼你的英语能力 http://composingprograms.com/pages/11-getting-started.html SICP中文课本(这个和英文版有不同之处,英文实在不行的人可以看看(比如我)) https://www.bookstack.cn/read/sicp-py-zh/README.md 别人有关sp21的相关笔记与答案 https://www.cnblogs.com/ikventure/p/14984919.html

有些问题这里找不到你可以试试其他年份61A的回答,可能也可以找到

https://github.com/FyisFe/UCB-CS61A-20Fall我曾经在里面找到过作业答案,时间不会完全对应,就比如说你这是lab05,他那可能是lab06 Python Tutor(平时自己可以多尝试尝试,尤其是学前面环境的时候你后面代码跑不出来的时候也可以尝试一下,不过你学到树和链表的时候这个东西可能会比较丑 https://pythontutor.com/composingprograms.html#mode=edit

他们开发的网页版解释器,支持python,scheme,SQL

https://code.cs61a.org/

CS61A 课程笔记

http://home.ustc.edu.cn/~liuly0322/blog/2021/12/23/cs61a/#%E5%87%BD%E6%95%B0%E5%BC%8F%E7%BC%96%E7%A8%8B%E5%AE%9A%E4%B9%89

学习经验__CS61A__完结填坑__总结

https://zhuanlan.zhihu.com/p/391809891

UCB的CS61A课程小结

https://zhuanlan.zhihu.com/p/60489592

 

写完scheme project后,在学BNF时,强烈建议阅读

https://blog.csdn.net/u012790503/article/details/112859204(文章里面的超链接和内容有关,一定要读,什么是AST这个链接打不开,你要用下面的)

https://blog.csdn.net/u012790503/article/details/114479265?utm_medium=distribute.pc_feed_404.none-task-blog-2~default~BlogCommendFromBaidu~Rate-2-114479265-blog-null.pc_404_mixedpudn&depth_1-utm_source=distribute.pc_feed_404.none-task-blog-2~default~BlogCommendFromBaidu~Rate-2-114479265-blog-null.pc_404_mixedpud

 

 

心路历程,

高中的某人,不知天高地厚,觉得编程非常简单,在高考考完的那个暑假他直接想干CMU-213,收掉CSAPP,

但后来他发现!自己看不懂代码.....

于是他顿悟了,按着群友的建议参考https://csdiy.wiki/ 开始了CS61A的学习。

 

怎么说呢,学完这门课有一种被现实毒打的感觉0.0

我深刻的明白了,我是一只鸡 饲料

 

·时间开销

那位大佬给出的课时估计大概是50个小时,然后他自己花了三周时间来学完这门课,于是我也打算花三周时间学完这门课!

但当到了三周的时候,我发现我的课里面还有一半多的东西都没有学,于是我咬咬牙。把我的时间延长了一倍。

最后我的时间花了2个月,最终用时大概在200小时左右,完成了这门非常非常厉害的课=_=看了下知乎,有的博主花了100h+,有的博主也是花了200h+,所以这门课如果你是纯新手的话,200h是比较正常的

(这边建议完全没有编程基础的人,去上cs50)

实践是非常重要的,我上课和做练习的时间大概是1比6

 

·评价

1,课程质量非常高,这个高主要体现在练习以及project,教sp21的老教授确实有点老了,看的出来知识很渊博,但就是有点......不灵活?(听说61A John教的版本经典一点)

2,作业难度比较大(对于我们这些新手)对有些option的要求我一般先看有没有答案,没有直接跳,虽然有autograder但自从有次我调试了1h都不知道自己哪里错了,我就再也没写过没有答案的作业

3,作业建议完成所有能完成的,不要忽略disc

4,考试可以选择mt1与final,资料自己在网站找,我不会回复,对于这种图

你需要挂梯子后然后点击上上面的文字,里面有超链接

 

 

总而言之一句话,不愧是伯克利大学的课,只要你跟着写完并且尽量不去参考答案,你一定可以收获一个非常宝贵的经历

尤其是project,每次写完都有一种劫后余生的感觉(我考完final的时候也有这种感觉)

 

打了引号的是引用的

  ‘’’ 另外一点,如果是跟着课程走,那么每期都能看到Solutions。但是课程一结束,所有Solutions都会失效消失。所以要提前备份。自学公开课的话,DISC是要对照答案的。DISC都是手写题没有自动测试。我只备份了fall2020的答案。LAB和HW都有自动测试autograder不需要看答案。问题解决实践是计算机科学进步的关键,不要作弊。 最想说的一点是浪费时间。比如TEXTBOOK 和练习,有些章节看不懂完全不理解很懊恼,有些有数学知识被吓到了,有些练习苦思冥想一直钻牛角尖。然后转头去做其他事情。当然,学习要有张弛劳逸结合。不过这个过程会浪费掉不少时间。建议:TEXTBOOK章节看不懂的再来回看几次,把代码复制自己敲一遍,遇到不懂得知识点马上谷歌搜索查一查,别分心。练习的话遇到难题,思考时间限定为2-4小时,如果有些题就是脑子转不过弯来,别分心,谷歌搜索查一查或者问问别人,或者再翻查这道题考察的知识点。 https://zhuanlan.zhihu.com/p/391809891 ‘’’

 

这门课不是一门单纯的语言课,如果你想当程序员的话,学61a是有必要的,如果你只想学习语言,不想以后在这个方面有所进展的话,那么61a是没有必要学的

因为他教的实在是太多了,除了语言外,他很多东西都教了一个入门,如果你只是想上一门语言课的话,这堂课是没有必要上的

就比如他在课上教你,为什么不存在一个程序,他可以判断出任何一个程序是死循环或者是可执行完毕的,从而引出没有完美的杀毒软件,蛮有趣的问题,可惜和语言没啥关系。

 

 

‘’’ CS61A介绍了编程和计算机科学,重点是抽象技术作为管理程序复杂性的手段。技术包括过程抽象;使用递归、高阶函数、生成器和流控制抽象;使用接口、对象、类和泛型操作符进行数据抽象;以及使用解释器和宏进行语言抽象。该课程向学生提供编程范例,包括函数式、面向对象和声明式方法。它包括对算法的渐近分析的介绍。有几个重要的编程项目。 ‘’’

 

一下开始分享个人笔记,我这就随便记点东西,可能有错误

写到后面几乎就咸鱼了....写笔记太难了

(建议也观看

http://home.ustc.edu.cn/~liuly0322/blog/2021/12/23/cs61a/#%E5%B0%BE%E9%80%92%E5%BD%92-1

我个人的笔记风格可以说是灾难性的

(你可能会奇怪我这么写括号,你学完可能就懂了)

 

·python碎片知识

·你可以用and与or 在return 后面来选择结果

·python 可以返回函数,函数执行必须要有括号,不然就是函数,函数定义的时候内部东西不会被执行

·coutainer 可以包含其他数据类型的一种数据类型

·可变性指的是你可以更改值,但不是影响一个东西的id

·一个东西是实参和形参,有些时候变量等于变量后两个变量名可能指的是一个东西,把所有python变量理解为指针就行(也因此有些东西可以塞到一个c数组里),一个东西如果没有任何东西指向,就是垃圾,会被回收

·a=[1],你可以用a.append(a)创建一个无限循环,但是a + a不行,一般只有方法不会修改一个东西的id(a[0]=x应该是语法糖,调用a.__setitem__(0,x))

·我们遍历的时候用的是指针,所以在途中你修改这个东西的话是很危险的,因此一般采用切片,这个是新建

·for循环是语法糖,本质是try while和except

 

 

·环境框架

·有两种环境,一种是静态的,一种是动态的,静态的选择当前环境,动态的选择最后上一个活跃的,目前静态为主流,python是静态的,一下只讨论静态

·函数在哪定义,他就绑定到当前框架,那么说就是当前框架就是他们的父框架

·一个符号,会在当前的框架寻找有无对应的东西,没有就会往上找,如果真的没有,他就会报错(萌新阶段经常返回字符串忘加’’)

·python 里面有 nonlocal 和global

·子框架没有权限修改父框架的东西,他只能用,除非你用上面的语句

·你如果在子框架里面出现了和父框架同名的东西,而且还用了赋值语句,赋值语句前如果你进行操作,就会报错(python)

 

 

·函数

·高阶函数是可以玩函数的函数

·我认为lambda的作用一般是用来传递参数,一些涉及到的题目可能会比较想不到,经常想用define代替

·在scheme,define语句本质是就是lambda

 

·递归

·你需要知道最小的情况怎么写

·你的每次递归都需要缩小输入的东西

·和数学归纳法很像,k成立那么k+1也成立,如果你觉得很难理解的话可以试试

·所以你需要信仰之跃 leap of faith

·尾递归

·尾递归好像都可以转化为尾迭代

·少用递归,容易爆栈,出bug

·优化的尾递归占用空间是常量

·尾递归是执行的最后一个语句,不是最后一行语句

·树递归是一次有很多递归的东西,线性递归就一次只有一个

 

·>>> 代码

结果

用好python的doctest

 

 

·OOP

·python使用鸭子类型

·函数名小写

·类名首字母大写,变量采用双驼峰

·本质上是把数据和对应的操作绑定在一起

·你可以在类里面的变量前加双下划线,这样python会努力防止外部不调用内部方法修改他

·继承,子类没有的东西,默认基础父类,类似的是类变量和实例

 

·数据抽象

·方便你不用管下面p事的东西,虽然你可能知道底层实现,但最好不要破坏抽象

 

·scheme 解释器与BNF

·你会发现有他们很像,你可以用一个 AST的东西看到他们的像

·我们可以用相互递归的递归找一个代码的结尾(之前一直觉得解释器很神奇)

 

·宏

·就是操作代码的代码

 

·树很适合递归

 

·生成器和迭代器,与iterable,之间有着复杂关系

·迭代器很妙,它可以减少空间,从加载n个变成一个一个加载就只需要一个

·对迭代器本身用iter会返回他自己,下一步要用next(),产生东西后,这个迭代器就变了

 

 

·有些时候你可以设置默认值来简化一些条件判断,比如‘哨兵’

·递归可以自下而上也可以自上而下,(有一道插入题我只会从前往后想,被爆头了)

·你读参数的时候,参数就会被自动执行一遍,(类似于scheme_eval )这个对宏的设置是不利的

 

 感谢帕梅拉和老教授对课堂的倾情奉献。

最后一堂课的欢快气氛实在是让人在轻松愉悦中结束了61A这一门课。

上节课末尾帕梅拉提议大家都穿成香蕉的样子,我以为他在开玩笑

这是填完调查报告回来后的帕梅拉,生动形象的体现了黑暗社会把人折磨的不像人的本质(狗头)

数学打断了我命运的脊梁

伯克利学生用scheme画的画也是人才

A (Recursive) Leap of Faith

 

Baked Century 经典老梗

BEEP BEEP BEEP