Storseminarium 2.1 - En sak i taget
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 studentmaterial och då syns dessa uppgifter inte på sidan.
Inför seminariet
Under seminariet
Vi går igenom nedanstående uppgifter tillsammans, det kommer finnas möjlighet till diskussion och frågor. Känn er fria att följa med på uppgifterna på egen dator under seminariet om ni lär er bättre så, men vi kan inte garantera att vi har tid att vänta in alla.
Pythontutor
Använd pythontutor.com för att stega igenom nedanstående kodexempel:
Summa från 0 till något heltal n
|
|
Summera lista (från föreläsningen)
|
|
Telephone game
Målet är att förstå:
- Hur man identifierar basfallet (när rekursionen ska sluta)
- Hur man definierar det rekursiva fallet (när funktionen ska anropa sig själv)
- Hur data förändras steg för steg i en rekursiv kedja
Telephone game (viskleken) är en lek som går ut på att skicka ett meddelande genom en sekvens av personer som återberättar meddelandet så noggrant som möjligt. Detta resulterar oftast i att meddelandet sakta ändrar mening, det kan handla om att ord byts ut till ett annat ord som låter snarlika, eller att enskilda bokstäver upfattas felaktigt.
Vår uppgift är nu att skriva ett program som använder enkelrekursion för att simulera en sådan lek. Funktionen telephone_game ska vara enkelrekursiv, och tar emot två parametrar; phone_list, som är en lista över namn på kompisar i den ordningen som meddelandet ska berättas; message, är en sträng som representerar meddelandet som varje kompis har uppfattat från tidigare samtal.
Uppgift: Skriv klart funktionen telephone_game i koden som du kan kopiera från i kurskatalogen /courses/729G46/kursmaterial/storsem/2_1
(kopiera hela katalogen med cp -r
). En zipfil kan också laddas ner här. Vi ska använda mutate
för att förändra meddelandet.
Förslag på lösningsstrategi
- Kolla om det är basfallet (inga personer kvar)
- Om basfall:
- Returnera meddelande
- Annars (rekursivt fall):
- Skriv ut vem som tar emot meddelandet
- Förvanska meddelandet
- Skriv ut vad personen hörde
- Anropa telephone_game med listan utan första namnet och det nya meddelandet
|
|
Att diskutera
- Uttrycker vi en iterativ processlösning eller en rekursiv processlösning? Varför?
- Kan vi konvertera till den andra typen och hur skulle det se ut?
- Hur kan vi modifiera lösningen för att samla delsteg i en lista istället för att bara skriva ut dem?
- Hur fungerar den verkliga situation som motsvarar vår lösning? Är den första personen i listan den som säger det ursprungliga meddelandet, eller är hen den första som hör det ursprungliga meddelandet och vad innebär det för i vilken ordning saker sker i simuleringen? Kan vi ändra vår tolkning och behöver vi i så fall modifiera koden?
- Kan vi modifiera lösningen för att skicka meddelandet i motsatt riktning genom listan av personer utan att ändra typen av lösning? Hur?
Sidansvarig: Johan Falkenjack
Senast uppdaterad: 2024-07-26