class RecursiveList:
"""A recursive implementation of a List
Representation Invariants:
- (self._first is None) == (self._rest is None)
"""
_first # The first item in this list, or None if this list is empty.
_rest: # A list containing the items in this list that come after the first one, or None if this list is empty.
def __init__(self, first, rest) -> None:
"""Initialize a new recursive list."""
self._first = first
self._rest = rest
def is_empty(self) -> bool:
"""Return whether this list is empty.
"""
return self._first is None
def sum(self) -> int:
"""Return the sum of the elements in this list.
"""
if self._first is None: # Base case: this list is empty
return 0
else:
return self._first + self._rest.sum()
def to_list(self) -> list:
"""Return a Python list containing the items stored in this list.
"""
if self.is_empty():
return []
elif self._rest is None:
return self._first
else:
return [self._first] + self._rest.to_list()
def __contains__(self, item) -> bool:
"""Return whether the given item is in this list.
"""
if self.is_empty():
return False
elif self._rest is None:
return self._first == item
else:
return item in self._rest or item == self._first
def index(self, item) -> int:
"""Return the index of the first occurrence of the given item in this list.
"""
if self.is_empty():
raise ValueError
elif self._first == item:
return 0
else:
return 1 + self._rest.index(item)
def insert(self, i: int, item) -> None:
"""Insert the given item in to this list at index i
"""
if self.is_empty() and i > 0:
raise IndexError
elif i == 0:
self._rest = RecursiveList(self._first, self._rest)
self._first = item
else:
self._rest.insert(i - 1, item)