CS61A_Lab_05

Q1

题目描述:

代码实现:

复制代码
 1 def coords(fn, seq, lower, upper):
 2     """
 3     >>> seq = [-4, -2, 0, 1, 3]
 4     >>> fn = lambda x: x**2
 5     >>> coords(fn, seq, 1, 9)
 6     [[-2, 4], [1, 1], [3, 9]]
 7     """
 8     "*** YOUR CODE HERE ***"
 9     #seq序列中的数字经过函数变化之后要在lower和upper的区间之中,否则就会被舍弃
10     #输出是以list的形式存在的
11     #所以我可以使用recursion
12     if not seq:
13       return []
14     if fn(seq[0])>=lower and fn(seq[0])<=upper:
15       return [[seq[0],fn(seq[0])]]+coords(fn,seq[1:],lower,upper)
16     else:
17       return coords(fn,seq[1:],lower,upper) 
18     #return [[x,f(x)] for x in seq if fn(x)>=lower and fn(x)<=upper]
复制代码

分析:

别人的实现非常的简洁,以后我也可以这么做。

我的实现好像有漏洞,当list只有一个了的时候,seq[1:]会超出list范围,可能会引起报错。

 

Q2:

题目描述:

代码实现:

复制代码
 1 def riffle(deck):
 2     """Produces a single, perfect riffle shuffle of DECK, consisting of
 3     DECK[0], DECK[M], DECK[1], DECK[M+1], ... where M is position of the
 4     second half of the deck.  Assume that len(DECK) is even.
 5     >>> riffle([3, 4, 5, 6])
 6     [3, 5, 4, 6]
 7     >>> riffle(range(20))
 8     [0, 10, 1, 11, 2, 12, 3, 13, 4, 14, 5, 15, 6, 16, 7, 17, 8, 18, 9, 19]
 9     """
10     "*** YOUR CODE HERE ***"
11     M=len(deck)//2
12     return [deck[k//2 + M*(k%2)] for k in range(len(deck))] 
复制代码

分析:

这个代码实现很巧妙。

第一个亮点就是 for k in range(len(deck)) 来进行记数,为后面判断奇偶做好准备。

第二个亮点就是注意到 10 11 12 13…… 其实就是0 1 2 3 加上中间值。用k//2来重复两次,太妙了。

Q3:

题目描述:

 

 代码:

复制代码
 1 def sprout_leaves(t,leaves):
 2     """Sprout new leaves containing the data in leaves at each leaf in
 3     the original tree t and return the resulting tree.
 4 
 5     >>> t1 = tree(1, [tree(2), tree(3)])
 6     >>> print_tree(t1)
 7     1
 8       2
 9       3
10     >>> new1 = sprout_leaves(t1, [4, 5])
11     >>> print_tree(new1)
12     1
13       2
14         4
15         5
16       3
17         4
18         5
19 
20     >>> t2 = tree(1, [tree(2, [tree(3)])])
21     >>> print_tree(t2)
22     1
23       2
24         3
25     >>> new2 = sprout_leaves(t2, [6, 1, 2])
26     >>> print_tree(new2)
27     1
28       2
29         3
30           6
31           1
32           2
33     """
34     "*** YOUR CODE HERE ***"
35     if is_leaf(t):
36         return tree(label(t), [tree(x) for x in leaves])
37         #增加枝叶
38     else:
39         return tree(label(t), [sprout_leaves(branch, leaves) for branch in branches(t)])
复制代码

 Q6 add tree 树的合并

代码:

复制代码
 1 def add_trees(t1, t2):
 2     """
 3     >>> numbers = tree(1,
 4     ...                [tree(2,
 5     ...                      [tree(3),
 6     ...                       tree(4)]),
 7     ...                 tree(5,
 8     ...                      [tree(6,
 9     ...                            [tree(7)]),
10     ...                       tree(8)])])
11     >>> print_tree(add_trees(numbers, numbers))
12     2
13       4
14         6
15         8
16       10
17         12
18           14
19         16
20     >>> print_tree(add_trees(tree(2), tree(3, [tree(4), tree(5)])))
21     5
22       4
23       5
24     >>> print_tree(add_trees(tree(2, [tree(3)]), tree(2, [tree(3), tree(4)])))
25     4
26       6
27       4
28     >>> print_tree(add_trees(tree(2, [tree(3, [tree(4), tree(5)])]), \
29     tree(2, [tree(3, [tree(4)]), tree(5)])))
30     4
31       6
32         8
33         5
34       5
35     """
36     "*** YOUR CODE HERE ***"
37     if is_leaf(t1):
38       return tree(label(t1)+label(t2),branches(t2))
39     elif is_leaf(t2):
40       return tree(label(t2)+label(t1),branches(t1))
41     else:
42       fewer_branch_t,more_branch_t=sorted([branches(t1),branches(t2)],key=len)
43       #sorted()函数将该列表中的两个子节点列表按照长度进行排序,并返回一个新的列表
44       #新的列表中第一个元素是子节点较少的树的子节点列表
45       # 第二个元素是子节点较多的树的子节点列表。每个branches只会有两个元素,len<=2

46 pad_t1=fewer_branch_t+[tree(0) for i in range(len(more_branch_t)-len(fewer_branch_t))] 47 pad_t2=more_branch_t 48 #是为了让两个list 元素对应,方便后面使用zip连接,再进行递归 49 return tree(label(t1)+label(t2),\ 50 [add_trees(b1,b2) for b1, b2 in zip(pad_t1,pad_t2)])
复制代码

 

posted @   哎呦_不想学习哟~  阅读(90)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)
点击右上角即可分享
微信分享提示