[CS61A] 學習記錄六 Lab2 題解思路分享
前言
觀前提示,筆者寫的代碼答案放在 GitHub倉庫 中,此處僅記錄過程與心得。
此外,請最好在嘗試獨立完成該任務后再看本文,否則就很可能失去了體驗本項目精華的機會
正文
Q1: WWPD: Lambda the Free
有兩個問題有點意思。
lambda 與參數
>>> b = lambda x: lambda: x # Lambdas can return other lambdas!
>>> c = b(88)
>>> c
______
該問題看似只是普通的 lambda 中傳 x,c 還傳入了 x 參數值為 88
所以答案是 88 嗎?
當然不是,這個問題結合下面這個問題就很顯然了。
>>> c()
______
那么想清楚這個問題的關鍵,就在于能否分辨 c 和 c() 的含義。
把 88 代入 c 的 lambda 式子,可以換成
c = lambda : 88
本質上,c 其實還是個 lambda 式子,只不過無參數,所以直接調用 c 不會得到 88,還得象征性地傳入無參數調用才行。
print 與 lambda
>>> print_lambda = lambda z: print(z) # When is the return expression of a lambda expression executed?
>>> one_thousand = print_lambda(1000)
______
>>> one_thousand
______
這個 print_lambda 只是一個把傳入參數直接 print 出來的函數罷了,那么第一個空當然是 1000 啦。
嗯嗯,對,不過重點是第二個空的答案,這個 print_lambda 到底把什么賦予給 one_thousand 了?
有同學會說,不是 1000 嗎?
不是喲,之所以第一個空會是 1000,是因為在賦值的過程前,先執行盡右側函數時,print 的。
排除了 1000,這又不是 Function(print_lambda 才是 Function,代入了參數后就不是啦),不是 Error,排除了所有可能,只能是 None 了。
想想也是,print 也沒有返回,None 也是理所應當。
Q2: WWPD: Higher Order Functions
值得注意的就一個點
如果有 return 而無變量承接,那 return * 就會相當于 print(*)。
Q3: Lambdas and Currying
需要通過多個 () 調用,說明內部有幾層 def。
Q4: Count van Count
要仔細看好,在測試里面,輸入的 condition 的輸入參數情況如何,輸出如何。
Q5: Make Adder
不難,題目也說了,不會就放這個 視覺化網站 看看結果
Q6: Lambda the Environment Diagram
同 Q5
Q7: Composite Identity Function
本質就是讓你寫個函數,返回對于 n ,先 f 后 g 與 先 g 后 f 是否相等,同時用上題目里的 compose1 函數。
Q8: I Heard You Liked Functions...Q8
這個問題有點意思,題目本質是要求給個函數,可以自定義循環對一個數字按順序循環執行的次數和數字大小。
陸爻齊的思路是,先寫一個可以根據循環次數,返回應該執行函數的函數,比如 i == 1 時,返回 f1,i == 4 時,也返回 f1 這樣。暫且叫 get_todo。
然后寫個循環,i <= n,對數字 num,代入執行 n 次 get_todo(i) 函數,結束。
小結
聽完課可以鍛煉英語聽力,同時也對這個 higher order function 有了更深的感觸,期待后續課程:)

浙公網安備 33010602011771號