[2021 spring] CS61A Lab 7: Object-Oriented Programming, Linked Lists, Mutable Trees
Lab07: https://inst.eecs.berkeley.edu/~cs61a/sp21/lab/lab07/#topics
Q2: Making Cards
class Card:
cardtype = 'Staff'
def __init__(self, name, attack, defense):
"*** YOUR CODE HERE ***"
self.name = name
self.attack = attack
self.defense = defense
def power(self, opponent_card):
"*** YOUR CODE HERE ***"
return self.attack - opponent_card.defense / 2
Q3: Making a Player
class Player:
def __init__(self, deck, name):
self.deck = deck
self.name = name
"*** YOUR CODE HERE ***"
self.hand = list()
for _ in range(5):
self.hand.append(self.deck.draw())
def draw(self):
assert not self.deck.is_empty(), 'Deck is empty!'
"*** YOUR CODE HERE ***"
self.hand.append(self.deck.draw())
def play(self, card_index):
"*** YOUR CODE HERE ***"
return self.hand.pop(card_index)
Q5: Convert Link (Linked Lists)
将链表结构转换为python列表,只需要将link.first依次添加到待返回的链表中。
代码:
def convert_link(link):
"""Takes a linked list and returns a Python list with the same elements.
>>> link = Link(1, Link(2, Link(3, Link(4))))
>>> convert_link(link)
[1, 2, 3, 4]
>>> convert_link(Link.empty)
[]
"""
"*** YOUR CODE HERE ***"
linkList = list()
while link:
linkList.append(link.first)
link = link.rest
return linkList
Q6: Cumulative Mul (Trees)
将每个节点的值变为该子树的所有节点值的乘积(累乘)。
分析:当前节点为叶节点时,不需要更改t.label;当前节点不为节点时,t.label需要乘上子节点的值b.label,在这之前对b进行cumulative mul。
代码:
def cumulative_mul(t):
"""Mutates t so that each node's label becomes the product of all labels in
the corresponding subtree rooted at t.
>>> t = Tree(1, [Tree(3, [Tree(5)]), Tree(7)])
>>> cumulative_mul(t)
>>> t
Tree(105, [Tree(15, [Tree(5)]), Tree(7)])
"""
"*** YOUR CODE HERE ***"
if not t.is_leaf():
for b in t.branches:
cumulative_mul(b)
t.label *= b.label