Storseminarium 2.2 - Experimentering
Innan seminariet ska du ha gått igenom Inför seminariet nedan och gjort tillhörande quiz. Syftet med detta är att du ska bekanta dig med innehållet så eventuella frågor kan redas ut under seminariet.
Denna sida visar en del av det som kommer att diskuteras på seminariet. Det kan hända att handledarna också tar upp andra uppgifter som inte behöver något specifikt studiematerial och då syns dessa uppgifter inte på sidan.
Inför seminariet
- Föreläsning 2 Webbversion, Sökbar version
- Förberedelsematerial
Under seminariet
Ni kommer att arbeta med uppgifterna tillsammans i mindre grupper, där ni diskuterar och förklarar för varandra, handledarna kommer att finnas till hjälp som under vanligt labb pass. Efter varje uppgift går handledarna igenom sin lösning i helklass, då finns möjlighet att ställa frågor och presentera alternativa lösningar.
Uppgift: Palindrom
Skriv en rekursiv och en iterativ funktion som tar en sträng och returnerar huruvida strängen är ett palindrom, alltså om strängen är densamma framlänges som baklänges. Problemet kan enkelt lösas genom att bara evaluera uttrycket seq == seq[::-1]
men här ska vi alltså använda rekursion och iteration istället.
Uppgift: Räkna förekomster
Skriv en funktion som tar en sekvens och ett värde och med hjälp av en lämplig loop räknar antalet förekomster av värdet i sekvensen. Funktionen ska fungera för tupler, listor och strängar.
Uppgift: Gissa tal
a)
Skriv en funktion guess_the_number(lowest, highest)
som slumpar ett tal mellan lowest
och highest
och låter användaren gissa tills hen gissat rätt. Vi kan ta input från användaren med hjälp av funktionen input(prompt)
.
OBS! Tänk på att värdet som slumpas av random.randint
är ett heltal och värdet som input
läser in är en sträng, det ena värdet måste alltså konverteras för att gissning och värde skall kunna jämföras.
Exempel
>>> guess_the_number(1, 5)
Gissa ett tal mellan 1 och 5: 1
Gissa ett tal mellan 1 och 5: 2
Gissa ett tal mellan 1 och 5: 3
Gissa ett tal mellan 1 och 5: 4
Rätt gissat!
b)
Nu ska vi göra funktionen lite mer hjälpsam så att vi snabbare ska kunna gissa rätt värde. Lägg till kod i guess_the_number
så att funktionen också skriver ut om gissningen är för hög eller för låg.
Exempel
Med strategin vi använde i förra exemplet hade vi behövt i snitt 50 gissningar innan vi gissar rätt. I värsta fall, om det slumpade talet är 100 och vi börjar gissa från 1 och testar värde för värde, så måste vi gissa 100 gånger.
Att funktionen informerar oss om huruvida vår gissing är för hög eller för låg innebär dock att vi kan använda en gissningsstrategi som kallas binärsökning där vi hela tiden halverar hur stort steg vi tar. Vi tar ett exempel där vi ska gissa ett slumpat värde mellan 1 och 100.
>>> guess_the_number(1, 100)
Gissa ett tal mellan 1 och 100: 50
För lågt!
Gissa ett tal mellan 1 och 100: 75
För lågt!
Gissa ett tal mellan 1 och 100: 87
För högt!
Gissa ett tal mellan 1 och 100: 81
För lågt!
Gissa ett tal mellan 1 och 100: 84
För högt!
Gissa ett tal mellan 1 och 100: 82
Rätt gissat!
c)
Vi ska nu vända på förhållandet och låta vårt program gissa istället. Skriv en funktion binary_search_gtn(lowest, highest)
som ska använda samma strategi som ovan för att lista ut ett värde som vi har bestämt i förväg. Dvs. istället för att programmet läser in en gissning från oss så gör programmet en gissning och vi svarar ifall gissningen är rätt (r
), för låg (l
) eller för hög (h
).
Exempel
Vi bestämmer att värdet ska vara 23 och informerar programmet att värdet ligger någonstans mellan 1 och 100:
>>> binary_search_gtn(1, 100)
Är talet 50? (r/l/h): h
Är talet 25? (r/l/h): h
Är talet 12? (r/l/h): l
Är talet 18? (r/l/h): l
Är talet 21? (r/l/h): l
Är talet 23? (r/l/h): r
Woho!
Uppgift: Ersätta värden
a)
Skriv en funktion replace_new(lst, old, new)
som tar en lista och två värden som argument. Funktionen skall returnera listan med alla förekomster av old
ersatta av new
. Funktionen får inte ändra på lst
.
b)
Skriv en funktion replace_inplace(lst, old, new)
som tar en lista och två värden som argument. Funktionen skall inte returnera något utan ändra i lst
så att alla förekomster av old
ersatts av new
.
Uppgift: Variablers synlighet
I följande kod finns en mängd variabler som har olika synlighet. Variablerna skrivs ut av anrop till print
som är markerade med siffror. Vilka utskrifter kommer att fungera och vilka kommer att ge ett felmeddelande? Vad skriver de som fungerar ut? Använd Pythontutor för att stega igenom när du är osäker.
|
|
Uppgift: Muterbarhet och funktionsanrop
Fungerar följande kodsnuttar och i så fall, vad skriver de ut?
a)
|
|
b)
|
|
c)
|
|
Sidansvarig: Johan Falkenjack
Senast uppdaterad: 2025-09-15