0%

CS61A 3 & 4

Week 3

2.2

1
2
3
4
5
6
7
8
9
10
11
12
>>> def pair(x, y):
"""Return a function that represents a pair."""
def get(index):
if index == 0:
return x
elif index == 1:
return y
return get

>>> def select(p, i):
"""Return the element at index i of pair p."""
return p(i)

用函数定义 pair 的方式。

2.3

对解释器而言,下划线只是环境中的另一个名称,但对程序员具有约定俗成的含义,表示该名称不会出现在任何未来的表达式中。

以前乱用下划线很不规范。

1
[<map expression> for <name> in <sequence expression> if <filter expression>]

Lab 3

1
2
3
4
5
6
7
checker = lambda x: False
i = 3
while i < n:
if not checker(i):
checker = (lambda f, x: lambda y: f(y) or y % x == 0)(checker, i)
i = i + 1
return checker

忽略 i 的范围,其实是用 lambda 更简洁地实现了筛法,得到的 checkerOR(x % p_i == 0)

需要注意的是 i 必须传值进去,如果内层调用则是地址,i 随循环改变后就会让 checker 出错。

Week 4

Q6

1
(lambda g: lambda x: g(g, x))(lambda f, n: 1 if n == 1 else n * f(f, n - 1))

题目是不直接递归实现 lambda 阶乘函数。

巧妙的解法。lambda f, n 把函数自身传递到下一层避免了直接递归。而 f 本身未给定,单独后一个括号只是“循环论证”,故再通过 lambda g 调用它,让 g 作为形式函数代表 f 即可。