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)])
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)