Feest met functies#

In deze opgave moeten de functies mult, dot, ind, scrabble_score en transcribe worden uitgewerkt met behulp van recursie. Gebruik de functies power, max, leng en vwl die je al eerder hebt gezien. Zorg er ook voor dat voor elke functie een docstring wordt opgenomen die aangeeft wat de argumenten van de functie betekenen en wat de returnwaarde ervan is, d.w.z. wat de functie doet.

Test jouw functies! Het is héél verleidelijk om een functie te schrijven en verder aan te nemen dat alles werkt, maar tot je hebt getest weet je niet zeker of alles in orde is! Kleine (of grote!) fouten zijn snel gemaakt en kunnen ervoor zorgen dat de code niet kan worden uitgevoerd (syntax fouten) of een resultaat geeft dat jij niet zo hebt bedoeld (functionele fouten) …

Voor de opdrachten geven we jou een aantal tests die je aan jouw uitwerkingen kan toevoegen. Als je vervolgens jouw bestand uitvoert worden de tests ook uitgevoerd en kan je (visueel, in ieder geval) controleren of er tests zijn die niet werken. Bedenk zelf ook tenminste twee testen per functie.

Edge cases#

Belangrijk bij het testen is om de edge cases te testen. Dit zijn situaties met extreme parameters. Bijvoorbeeld een lege string, of een hele lange. Als een robot random in een kamer wordt geplaats is de kans klein dat hij aan de rand van de kamer begint, en nog kleiner dat hij in een hoek begint. Beide situaties zijn belangrijk om te testen. De tests die we bij de opdrachten geven zijn vaak de basis gevallen. Bij het nakijken van jullie werk testen we ook edge cases. Test je programma zorgvuldig!

Opdracht 1#

a. Kopieer onderstaande code naar een bestand genaamd wk5wc2.py. Gegeven de start van de functie mult(n, m) en een aantal assertions om deze functie te testen.

import time
from random import *

def main():
    """
    Main functie. Roept de andere functies op om hun werk te doen. 
    """
    print(mult(6,7))

def testing():
    """
    Test functie. Hier staan alle assertions om de functies te testen.
    """

    # assertions for mult
    assert mult(6, 7) == 42
    assert mult(6, -7) == -42
    assert mult(-6, 7) == -42
    assert mult(-6, -7) == 42
    assert mult(6, 0) == 0
    assert mult(0, 7) == 0
    assert mult(0, 0) == 0

def mult(n, m):
    """
    Multiply two numbers and returns the result
    parameter n: an integer
    parameter m: an integer
    returns: an integer. 
    """

main()
testing()

b. De functie mult(n, m) moet het product (de vermenigvuldiging) van de twee gehele getallen n en m als resultaat teruggeven. Omdat het een beetje te gemakkelijk zou zijn om de vermenigvuldigingsoperator * te gebruiken mag je alleen maar gebruik maken van +, - (om negatieve getallen te maken), in combinatie met recursie.

tips
Bekijk de functie pow(n, m) die in het hoorcollege is behandeld.
Base case eerst. Wanneer moet de functie stoppen? Wat is het resultaat van de base case?
Werk daarna case voor case. Zorg eerst dat de functie werkt voor enkel positieve getallen, ga daarna uitbreiden tot de negatieve getallen.

Opdracht 2#

Schrijf de functie dot(L, k). De functie dot(L, k) moet het inwendig product (inproduct of dot product) van de lijsten L en k teruggeven. Als de twee lijsten niet even lang zijn, moet dot de waarde 0.0 teruggeven. Als de lijsten beide leeg zijn, moet dot ook 0.0 teruggeven. Je mag ervan uitgaan dat de lijsten alleen maar getallen bevatten en je mag de vermenigvuldigingsoperator * gebruiken bij deze opgave!

Wat is het inproduct? Het inproduct van twee lijsten (die in deze context dan vectoren genoemd worden) is de som van de producten van de elementen die op dezelfde positie staan in de twee vectoren. Bijvoorbeeld, het inproduct van de lijsten [5, 3] en [6, 4] zal 5 * 6 plus 3 * 4 zijn wat gelijk staat aan 42.

Hier zie je een aantal tests die je voor de functie dot kan gebruiken:

assert dot([5, 3], [6, 4]) == 42.0
assert dot([1, 2, 3, 4], [10, 100, 1000, 10000]) == 43210.0
assert dot([5, 3], [6]) == 0.0
assert dot([], [6]) == 0.0
assert dot([], []) == 0.0

Opdracht 3#

Schrijf de functie ind(e, L), die een sequentie L en een element e accepteert. L kan een string of een lijst zijn.

De functie ind moet de positie of index teruggeven waarop e voor het eerst voorkomt in L. De index begint bij 0, zoals gebruikelijk bij lijsten. Als e geen element van L is, dan moet ind(e, L) een integer teruggeven die gelijk is aan len(L). Je mag hier de Python functie index niet gebruiken.

Hier zijn een aantal tests die je voor deze functie kan gebruiken:

assert ind(42, [55, 77, 42, 12, 42, 100]) == 2
assert ind(42, list(range(0, 100))) == 42
assert ind("hoi", ["hallo", 42, True]) == 3
assert ind("hoi", ["oh", "hoi", "daar"]) == 1
assert ind("i", "team") == 4
assert ind(" ", "nader onderzoek") == 5

Opdracht 4#

a. De functie letter_score(let) krijgt één argument mee, een string met een enkele letter en geeft de waarde van deze letter op de Scrabble tegel terug. Als het argument niet een letter van 'a' tot en met 'z' is moet de functie 0 teruggeven.

Let op, letter_score heeft geen recursie nodig.

Om deze functie te schrijven heb je onderstaande waardes van de Scrabble tegels nodig.

Scrabble tegels

Betekent dit dat je 25 of 26 if, elif of else statements moet gaan schrijven? Nee! Gebruik in plaats daarvan het keyword in.

if let in "xy":
    return 8

Vergeet niet de functie goed te testen voordat je aan opdracht b begint!

b. Shrijf de functie scrabble_score(s). scrabble_score moet een string s meekrijgen, die alleen maar kleine letters bevat, en de Scrabble score van de string teruggeeft. Je mag negeren dat in het echte spel sommige tegels maar beperkt beschikbaar zijn. Vergelijk dit met het voorbeeld vwl dat eerder is besproken, maar bedenk dat je verschillende waardes moet toevoegen voor elke letter.

Hier zijn de tests die je kan gebruiken:

assert scrabble_score("quotums") == 24
assert scrabble_score("jacquet") == 24
assert scrabble_score("pyjama") == 20
assert scrabble_score("abcdefghijklmnopqrstuvwxyz") == 84
assert scrabble_score("?!@#$%^&*()") == 0
assert scrabble_score("") == 0