Discussion 8: Inheritance, Linked Lists
Linked Lists
A linked list is a Link object or Link.empty.
You can mutate a Link object s in two ways:
- Change the first element with
s.first = ... - Change the rest of the elements with
s.rest = ...
You can make a new Link object by calling Link:
Link(4)makes a linked list of length 1 containing 4.Link(4, s)makes a linked list that starts with 4 followed by the elements of linked lists.
class Link:
"""A linked list is either a Link object or Link.empty
>>> s = Link(3, Link(4, Link(5)))
>>> s.rest
Link(4, Link(5))
>>> s.rest.rest.rest is Link.empty
True
>>> s.rest.first * 2
8
>>> print(s)
<3 4 5>
"""
empty = ()
def __init__(self, first, rest=empty):
assert rest is Link.empty or isinstance(rest, Link)
self.first = first
self.rest = rest
def __repr__(self):
if self.rest:
rest_repr = ', ' + repr(self.rest)
else:
rest_repr = ''
return 'Link(' + repr(self.first) + rest_repr + ')'
def __str__(self):
string = '<'
while self.rest is not Link.empty:
string += str(self.first) + ' '
self = self.rest
return string + str(self.first) + '>'
Q1: Sum Two Ways
Implement both sum_rec and sum_iter. Each one takes a linked list of numbers
s and a non-negative integer k and returns the sum of the first k elements
of s. If there are fewer than k elements in s, all of them are summed. If
k is 0 or s is empty, the sum is 0.
Use recursion to implement sum_rec. Don't use recursion to implement
sum_iter; use a while loop instead.
s.first to the sum of the first k-1 elements in s.rest. Your base case
condition should include s is Link.empty so that you're checking whether s
is empty before ever evaluating s.first or s.rest.
total, then repeatedly (in a while loop) add
s.first to total, set s = s.rest to advance through the linked list, and reduce k by one.
Discussion time: When adding up numbers, the intermediate sums depend on the
order. (1 + 3) + 5 and 1 + (3 + 5) both equal 9, but the first one makes 4
along the way while the second makes 8 along the way. For the same linked list
s and length k, will sum_rec and sum_iter both make the same
intermediate sums along the way?
Q2: Every Other
Implement every_other, which takes a linked list s. It mutates s such
that all of the odd-indexed elements (using 0-based indexing) are removed from
the list. For example:
>>> s = Link('a', Link('b', Link('c', Link('d'))))
>>> every_other(s)
>>> s.first
'a'
>>> s.rest.first
'c'
>>> s.rest.rest is Link.empty
True
If s contains fewer than two elements, s remains unchanged.
Run in 61A CodeDo not return anything!
every_othershould mutate the original list.
Inheritance
Q3: Cat
Below is the implementation of a Pet class. Each pet has two instance attributes
(name and owner), as well as one instance method (talk).
class Pet:
def __init__(self, name, owner):
self.name = name
self.owner = owner
def talk(self):
print(self.name)
Implement the Cat class, which inherits from
the Pet class seen above. To complete the implementation, override or implement the following methods:
___init___
Set the Cat's name and owner attributes, and also add 2 new attributes:
is_hungry- should be set toFalsefullness- should be set to whatever thefullnessparameter is
Hint: You can call the
__init__method ofPet(the superclass ofCat) to set a cat'snameandownerusingsuper().
talk
Print out a cat's greeting, which is "<name of cat> says meow!".
get_hungry
Decrements a cat's fullness level by 1. When fullness reaches zero,
is_hungry becomes True. If this is called after fullness has already
reached zero, print the message "<name of cat> is hungry."
eat
This method is called when the cat eats some food.
If the cat is hungry, after calling this method both of the following should be true:
- The cat's
fullnessvalue should be set to whateverCat.default_fullnessis. - The cat's
is_hungryvalue should beFalse.
Also print out the food the cat ate. For example, if a cat named Thomas
ate fish, print out 'Thomas ate a fish!'
Otherwise, if the cat wasn't hungry, print '<name of cat> is not hungry.'
Document the Occasion
Please all fill out the attendance form (one submission per person per week).