Vi lägger grunden för laboration 4 där vi fortsätter fördjupa oss i iteration och rekursion. Dessutom övar vi på lite mjukare, men minst lika viktiga, frågor om programmeringspraxis och namngivning.
Här visas ett urval av uppgifter som kan förekomma under seminariet. Syftet är att du ska få chansen att förbereda dig på några övningar eller gå tillbaka och repetera övningar i efterhand. Seminarieledarna kommer oftast att lägga in ytterligare uppgifter. Titta gärna på materialet för andra inriktningar om du vill ha fler övningar.
Följande kapitel i studiematerialet förbereder för det här seminariet:
Följande kapitel i studiematerialet finns med i planeringen för den här veckan, men tas upp först i nästa seminarium:
Seminariet kommer att inledas med diskussion av några av koncepten från studiematerialet.
- När kan en funktion anses vara korrekt?
- Varför är det viktigt att kod är läsbar?
- Vad innebär att kod är självdokumenterande?
- Hur ska blankrader användas? Hur många?
- Hur ska kommentarer användas? Vad är deras syfte?
- Vad är docstrings och vad används de till?
- Varför ska rader max ha 79 tecken?
- Hur bör mellanrum användas i matematiska beräkningar?
- Varför är det viktigt med testbarhet och hur uppnår man testbarhet?
Föreslå namn på följande:
- En variabel som används för att räkna element i en lista
- En klass som fungerar som en lista men har bestämd längd
- Ett undantag som kastas när en avlägsen server inte svarar
- En pythonfil innehållande ett antal hjälpfunktioner (modul) för beräkningar med imaginära tal .
- Bredden på ett fönster som ej kan ändras
- En funktion som returnerar huruvida en användare finns i en databas
Givet är en funktion find_in_list
som rekursivt letar efter ett element i en lista och returnerar True
om det finns.
def find_in_list(seq, needle):
if not seq:
return False
elif seq[0] == needle:
return True
else:
return find_in_list(seq[1:], needle)
Vi vill nu kunna köra funktionen på listor av listor och hitta om elementet finns i någon av listorna. Skriv om funktionen så att den gör det.
Ett släktträd som inte inkluderar ingifta medlemar kan beskrivas som nästlade listor av tupler där första elementet är namnet på en person, och andra elementet är en lista på personens barn och deras träd
Här följer ett exempel:
[
("Carl Gustaf", [
("Victoria", [
("Estelle", []),
("Oscar", [])
]),
("Carl Philip", [
("Alexander", [])
]),
("Madeleine", [
("Leonore", []),
("Nicolas", [])
])
]),
("Birgitta", [])
]
Nedan följer en funktion som givet en person returnerar den personens förfäder. Om personen inte finns returneras None
def ancestors_of(tree, person):
"""
Tries to return a list of `person`s ancenstors. If person is not in the tree,
None is returned
"""
if tree == []:
# We reached an empty tree, this branch does not contain the couple
return None
elif tree[0][0] == person:
# We found the couple, start constructing a list
return []
else:
# Traverse the children of this node to check if they contain the couple
rest_result = ancestors_of(tree[0][1], person)
if isinstance(rest_result, list):
# The next iteration found the person, append the current person to the list
rest_result.append(tree[0][0])
return rest_result
else:
# We know the current node or its children do not contain the person,
# look through its siblings
return ancestors_of(tree[1:], person)
Vilken ordning skulle elementen sökas igenom om funktionen körs med exempelträdet ovan och med en person som inte är med i trädet?
Sidansvarig: Jonas Kvarnström
Senast uppdaterad: 2025-09-09