CS61A 結(jié)課筆記、感想以及資源
終于把CS61A 收掉了!?。∽詈髮懥艘幌耭inal test,得分是76,和樹有關(guān)的東西都扣爆了,扣了18分,最后看了一下是自己都會(huì)的題目.....勉強(qiáng)達(dá)到了心里的及格分,于是就出來(lái)分享一下有關(guān)61A的資源,評(píng)價(jià),以及知識(shí)點(diǎn)了
?
開始分享資料
注意 ·我選擇的是sp21版本,因?yàn)閎站有精譯版,而且資料相對(duì)比較全
sp21的主頁(yè)(找作業(yè)和考試資料)
https://inst.eecs.berkeley.edu/~cs61a/sp21/
課本(英文版,推薦這個(gè))(強(qiáng)烈推薦,就算你看過(guò)中文版最好也看一遍,和中文版是有不一樣的,而且可以鍛煉你的英語(yǔ)能力)
http://composingprograms.com/pages/11-getting-started.html
SICP中文課本(這個(gè)和英文版有不同之處,英文實(shí)在不行的人可以看看(比如我))
https://www.bookstack.cn/read/sicp-py-zh/README.md
別人有關(guān)sp21的相關(guān)筆記與答案
https://www.cnblogs.com/ikventure/p/14984919.html
有些問(wèn)題這里找不到你可以試試其他年份61A的回答,可能也可以找到
https://github.com/FyisFe/UCB-CS61A-20Fall(我曾經(jīng)在里面找到過(guò)作業(yè)答案,時(shí)間不會(huì)完全對(duì)應(yīng),就比如說(shuō)你這是lab05,他那可能是lab06)
Python Tutor(平時(shí)自己可以多嘗試嘗試,尤其是學(xué)前面環(huán)境的時(shí)候,你后面代碼跑不出來(lái)的時(shí)候也可以嘗試一下,不過(guò)你學(xué)到樹和鏈表的時(shí)候這個(gè)東西可能會(huì)比較丑)
https://pythontutor.com/composingprograms.html#mode=edit
他們開發(fā)的網(wǎng)頁(yè)版解釋器,支持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
學(xué)習(xí)經(jīng)驗(yàn)__CS61A__完結(jié)填坑__總結(jié)
https://zhuanlan.zhihu.com/p/391809891
UCB的CS61A課程小結(jié)
https://zhuanlan.zhihu.com/p/60489592
?
寫完scheme project后,在學(xué)BNF時(shí),強(qiáng)烈建議閱讀
https://blog.csdn.net/u012790503/article/details/112859204(文章里面的超鏈接和內(nèi)容有關(guān),一定要讀,什么是AST這個(gè)鏈接打不開,你要用下面的)
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
?
?
心路歷程,
高中的某人,不知天高地厚,覺得編程非常簡(jiǎn)單,在高考考完的那個(gè)暑假他直接想干CMU-213,收掉CSAPP,
但后來(lái)他發(fā)現(xiàn)!自己看不懂代碼.....
于是他頓悟了,按著群友的建議參考https://csdiy.wiki/ 開始了CS61A的學(xué)習(xí)。
?
怎么說(shuō)呢,學(xué)完這門課有一種被現(xiàn)實(shí)毒打的感覺0.0
我深刻的明白了,我是一只雞
飼料
?
·時(shí)間開銷
那位大佬給出的課時(shí)估計(jì)大概是50個(gè)小時(shí),然后他自己花了三周時(shí)間來(lái)學(xué)完這門課,于是我也打算花三周時(shí)間學(xué)完這門課!
但當(dāng)?shù)搅巳艿臅r(shí)候,我發(fā)現(xiàn)我的課里面還有一半多的東西都沒有學(xué),于是我咬咬牙。把我的時(shí)間延長(zhǎng)了一倍。
最后我的時(shí)間花了2個(gè)月,最終用時(shí)大概在200小時(shí)左右,完成了這門非常非常厲害的課=_=看了下知乎,有的博主花了100h+,有的博主也是花了200h+,所以這門課如果你是純新手的話,200h是比較正常的
(這邊建議完全沒有編程基礎(chǔ)的人,去上cs50)
實(shí)踐是非常重要的,我上課和做練習(xí)的時(shí)間大概是1比6
?
·評(píng)價(jià)
1,課程質(zhì)量非常高,這個(gè)高主要體現(xiàn)在練習(xí)以及project,教sp21的老教授確實(shí)有點(diǎn)老了,看的出來(lái)知識(shí)很淵博,但就是有點(diǎn)......不靈活?(聽說(shuō)61A John教的版本經(jīng)典一點(diǎn))
2,作業(yè)難度比較大(對(duì)于我們這些新手)對(duì)有些option的要求我一般先看有沒有答案,沒有直接跳,雖然有autograder但自從有次我調(diào)試了1h都不知道自己哪里錯(cuò)了,我就再也沒寫過(guò)沒有答案的作業(yè)
3,作業(yè)建議完成所有能完成的,不要忽略disc
4,考試可以選擇mt1與final,資料自己在網(wǎng)站找,我不會(huì)回復(fù),對(duì)于這種圖

你需要掛梯子后然后點(diǎn)擊上上面的文字,里面有超鏈接
?
?
總而言之一句話,不愧是伯克利大學(xué)的課,只要你跟著寫完并且盡量不去參考答案,你一定可以收獲一個(gè)非常寶貴的經(jīng)歷
尤其是project,每次寫完都有一種劫后余生的感覺(我考完final的時(shí)候也有這種感覺)
?
打了引號(hào)的是引用的
?
‘’’
另外一點(diǎn),如果是跟著課程走,那么每期都能看到Solutions。但是課程一結(jié)束,所有Solutions都會(huì)失效消失。所以要提前備份。自學(xué)公開課的話,DISC是要對(duì)照答案的。DISC都是手寫題沒有自動(dòng)測(cè)試。我只備份了fall2020的答案。LAB和HW都有自動(dòng)測(cè)試autograder不需要看答案。問(wèn)題解決實(shí)踐是計(jì)算機(jī)科學(xué)進(jìn)步的關(guān)鍵,不要作弊。
最想說(shuō)的一點(diǎn)是浪費(fèi)時(shí)間。比如TEXTBOOK 和練習(xí),有些章節(jié)看不懂完全不理解很懊惱,有些有數(shù)學(xué)知識(shí)被嚇到了,有些練習(xí)苦思冥想一直鉆牛角尖。然后轉(zhuǎn)頭去做其他事情。當(dāng)然,學(xué)習(xí)要有張弛勞逸結(jié)合。不過(guò)這個(gè)過(guò)程會(huì)浪費(fèi)掉不少時(shí)間。建議:TEXTBOOK章節(jié)看不懂的再來(lái)回看幾次,把代碼復(fù)制自己敲一遍,遇到不懂得知識(shí)點(diǎn)馬上谷歌搜索查一查,別分心。練習(xí)的話遇到難題,思考時(shí)間限定為2-4小時(shí),如果有些題就是腦子轉(zhuǎn)不過(guò)彎來(lái),別分心,谷歌搜索查一查或者問(wèn)問(wèn)別人,或者再翻查這道題考察的知識(shí)點(diǎn)。
https://zhuanlan.zhihu.com/p/391809891
‘’’
?
這門課不是一門單純的語(yǔ)言課,如果你想當(dāng)程序員的話,學(xué)61a是有必要的,如果你只想學(xué)習(xí)語(yǔ)言,不想以后在這個(gè)方面有所進(jìn)展的話,那么61a是沒有必要學(xué)的
因?yàn)樗痰膶?shí)在是太多了,除了語(yǔ)言外,他很多東西都教了一個(gè)入門,如果你只是想上一門語(yǔ)言課的話,這堂課是沒有必要上的
就比如他在課上教你,為什么不存在一個(gè)程序,他可以判斷出任何一個(gè)程序是死循環(huán)或者是可執(zhí)行完畢的,從而引出沒有完美的殺毒軟件,蠻有趣的問(wèn)題,可惜和語(yǔ)言沒啥關(guān)系。
?
?
‘’’
CS61A介紹了編程和計(jì)算機(jī)科學(xué),重點(diǎn)是抽象技術(shù)作為管理程序復(fù)雜性的手段。技術(shù)包括過(guò)程抽象;使用遞歸、高階函數(shù)、生成器和流控制抽象;使用接口、對(duì)象、類和泛型操作符進(jìn)行數(shù)據(jù)抽象;以及使用解釋器和宏進(jìn)行語(yǔ)言抽象。該課程向?qū)W生提供編程范例,包括函數(shù)式、面向?qū)ο蠛吐暶魇椒椒?。它包括?duì)算法的漸近分析的介紹。有幾個(gè)重要的編程項(xiàng)目。
‘’’
?
一下開始分享個(gè)人筆記,我這就隨便記點(diǎn)東西,可能有錯(cuò)誤
寫到后面幾乎就咸魚了....寫筆記太難了
(建議也觀看
http://home.ustc.edu.cn/~liuly0322/blog/2021/12/23/cs61a/#%E5%B0%BE%E9%80%92%E5%BD%92-1
我個(gè)人的筆記風(fēng)格可以說(shuō)是災(zāi)難性的
)
(你可能會(huì)奇怪我這么寫括號(hào),你學(xué)完可能就懂了)
?
·python碎片知識(shí)
·你可以用and與or 在return 后面來(lái)選擇結(jié)果
·python 可以返回函數(shù),函數(shù)執(zhí)行必須要有括號(hào),不然就是函數(shù),函數(shù)定義的時(shí)候內(nèi)部東西不會(huì)被執(zhí)行
·coutainer 可以包含其他數(shù)據(jù)類型的一種數(shù)據(jù)類型
·可變性指的是你可以更改值,但不是影響一個(gè)東西的id
·一個(gè)東西是實(shí)參和形參,有些時(shí)候變量等于變量后兩個(gè)變量名可能指的是一個(gè)東西,把所有python變量理解為指針就行(也因此有些東西可以塞到一個(gè)c數(shù)組里),一個(gè)東西如果沒有任何東西指向,就是垃圾,會(huì)被回收
·a=[1],你可以用a.append(a)創(chuàng)建一個(gè)無(wú)限循環(huán),但是a + a不行,一般只有方法不會(huì)修改一個(gè)東西的id(a[0]=x應(yīng)該是語(yǔ)法糖,調(diào)用a.__setitem__(0,x))
·我們遍歷的時(shí)候用的是指針,所以在途中你修改這個(gè)東西的話是很危險(xiǎn)的,因此一般采用切片,這個(gè)是新建
·for循環(huán)是語(yǔ)法糖,本質(zhì)是try while和except
?
?
·環(huán)境框架
·有兩種環(huán)境,一種是靜態(tài)的,一種是動(dòng)態(tài)的,靜態(tài)的選擇當(dāng)前環(huán)境,動(dòng)態(tài)的選擇最后上一個(gè)活躍的,目前靜態(tài)為主流,python是靜態(tài)的,一下只討論靜態(tài)
·函數(shù)在哪定義,他就綁定到當(dāng)前框架,那么說(shuō)就是當(dāng)前框架就是他們的父框架
·一個(gè)符號(hào),會(huì)在當(dāng)前的框架尋找有無(wú)對(duì)應(yīng)的東西,沒有就會(huì)往上找,如果真的沒有,他就會(huì)報(bào)錯(cuò)(萌新階段經(jīng)常返回字符串忘加’’)
·python 里面有 nonlocal 和global
·子框架沒有權(quán)限修改父框架的東西,他只能用,除非你用上面的語(yǔ)句
·你如果在子框架里面出現(xiàn)了和父框架同名的東西,而且還用了賦值語(yǔ)句,賦值語(yǔ)句前如果你進(jìn)行操作,就會(huì)報(bào)錯(cuò)(python)
?
?
·函數(shù)
·高階函數(shù)是可以玩函數(shù)的函數(shù)
·我認(rèn)為lambda的作用一般是用來(lái)傳遞參數(shù),一些涉及到的題目可能會(huì)比較想不到,經(jīng)常想用define代替
·在scheme,define語(yǔ)句本質(zhì)是就是lambda
?
·遞歸
·你需要知道最小的情況怎么寫
·你的每次遞歸都需要縮小輸入的東西
·和數(shù)學(xué)歸納法很像,k成立那么k+1也成立,如果你覺得很難理解的話可以試試
·所以你需要信仰之躍 leap of faith
·尾遞歸
·尾遞歸好像都可以轉(zhuǎn)化為尾迭代
·少用遞歸,容易爆棧,出bug
·優(yōu)化的尾遞歸占用空間是常量
·尾遞歸是執(zhí)行的最后一個(gè)語(yǔ)句,不是最后一行語(yǔ)句
·樹遞歸是一次有很多遞歸的東西,線性遞歸就一次只有一個(gè)
?
·>>> 代碼
結(jié)果
用好python的doctest
?
?
·OOP
·python使用鴨子類型
·函數(shù)名小寫
·類名首字母大寫,變量采用雙駝峰
·本質(zhì)上是把數(shù)據(jù)和對(duì)應(yīng)的操作綁定在一起
·你可以在類里面的變量前加雙下劃線,這樣python會(huì)努力防止外部不調(diào)用內(nèi)部方法修改他
·繼承,子類沒有的東西,默認(rèn)基礎(chǔ)父類,類似的是類變量和實(shí)例
?
·數(shù)據(jù)抽象
·方便你不用管下面p事的東西,雖然你可能知道底層實(shí)現(xiàn),但最好不要破壞抽象
?
·scheme 解釋器與BNF
·你會(huì)發(fā)現(xiàn)有他們很像,你可以用一個(gè) AST的東西看到他們的像
·我們可以用相互遞歸的遞歸找一個(gè)代碼的結(jié)尾(之前一直覺得解釋器很神奇)
?
·宏
·就是操作代碼的代碼
?
·樹很適合遞歸
?
·生成器和迭代器,與iterable,之間有著復(fù)雜關(guān)系
·迭代器很妙,它可以減少空間,從加載n個(gè)變成一個(gè)一個(gè)加載就只需要一個(gè)
·對(duì)迭代器本身用iter會(huì)返回他自己,下一步要用next(),產(chǎn)生東西后,這個(gè)迭代器就變了

?
?
·有些時(shí)候你可以設(shè)置默認(rèn)值來(lái)簡(jiǎn)化一些條件判斷,比如‘哨兵’
·遞歸可以自下而上也可以自上而下,(有一道插入題我只會(huì)從前往后想,被爆頭了)
·你讀參數(shù)的時(shí)候,參數(shù)就會(huì)被自動(dòng)執(zhí)行一遍,(類似于scheme_eval )這個(gè)對(duì)宏的設(shè)置是不利的
?
?感謝帕梅拉和老教授對(duì)課堂的傾情奉獻(xiàn)。
最后一堂課的歡快氣氛實(shí)在是讓人在輕松愉悅中結(jié)束了61A這一門課。



伯克利學(xué)生用scheme畫的畫也是人才

?

