TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 9 juni 2016, kl 14 18 Läs alla frågorna först, och bestäm dig för i vilken ordning du vill lösa uppgifterna. Skriv tydligt och läsligt. Använd väl valda namn på parametrar och indentera din kod.väl valda namn omfattar exempelvis att inte blanda språk. Om du vill avsluta samtliga parenteser i en funktionsdefinition, kan du om du vill skriva en stor parentes: ]. Observera att detta innebär att du sluter samtliga öppna parenteser. Även om det i uppgiften står att du skall skriva en procedur/funktion, så får du skriva ytterligare hjälpfunktioner som kan vara nödvändiga. Observera att poängavdrag kan ges för onödigt komplicerade eller ineffektiva lösningar. Betygsgränser: 12-15 betyg 15.5-18.5 betyg 4 19-24 betyg 5 Lycka till!
Uppgift 1. Beräkning av uttryck (4 poäng) Vi ger DrRacket följande uttryck att beräkna (i ordningen som anges). Vilka värden returneras? Om det blir fel, beskriv varför (vilken typ av fel). > ( define a a) > a > ( define f ( lambda () +)) > f > ( define g ( lambda args *)) > g > ( define x (g ( cons 1 2))) > x > ( define y (f 1 2)) > y > ( define z ((f) 17 18) ) > z > ( define u (a 19) ) > u > ( define v (( lambda (x y) y) u)) > v Uppgift 2. Box-pointer diagram (4 poäng) Antag att vi har evaluerat följande Racket-uttryck (i ordning). ( define p ( mcons 7 0)) ( set-mcdr! p ( mcons p p)) ( set-mcdr! ( mcdr p) 7) ( define q ( mcons 1 2)) ( set-mcar! q ( mcons 1 ( mcons 2 ( mcons ())))) ( set-mcdr! q ( mcdr ( mcar q))) a) Rita box-pointer diagram som visar de slutliga strukturer som p och q är bundna till. Du behöver alltså inte visa alla strukturella förändringar stegvis. b) En av strukturerna p och q kan skapas utan att man använder set-mcar! eller set-mcdr!. Vilken? Skriv den kod som skapar den. Du får använda define, let eller lambda i samband med din lösning. 2
Uppgift. Tillstånd och omgivningsdiagram (5 poäng) Vi ges följande kod: ( define val 100) ( define (g x) (* val x)) ( let ([ val 9]) (g )) a) När vi evaluerar koden returneras ett värde. Vilket? (1.5p) b) På nästa sida ser du fyra omgivningsdiagram. Vilket uppstår när vi evaluerar koden ovan? Enbart en bokstav (A/B/C/D) behövs. Korrekt svar ger 1.5 poäng, felaktigt svar leder till ett avdrag på 1.0 poäng 1. Du behöver inte svara denna deluppgift om du inte vill. (1.5p) c) Vi ges följande kod: (define (change-val! var new-val) (set! var new-val)) (define tesco cat) (change-val! tesco dog) Vilket värde har tesco efteråt? Varför? Motivera kortfattat (max en-två meningar). (2p) 1 Uppgift kan alltså inte ge minuspoäng.
A g: val: 100 GE val: 9 E1 B g: val: 100 GE val: 9 E1 x: E2 x: E2 args: x body: (* val x) args: val body: (g ) args: x body: (* val x) args: val body: (g ) C g: val: 100 9 GE x: E1 D g: val: 100 GE val: 9 E1 x: E2 args: x body: (* 100 x) args: val body: (g ) args: x body: (* val x) args: val body: (g )
Uppgift 4. Rekursionsmodeller (4 poäng) Nedan ges du kod för en funktion som tar en lista av tal, och returnerar summan av kvadraten av varje element: ( define ( square x) (* x x)) ( define ( sum-square seq ) (if ( null? seq ) 0 (+ ( square ( car seq )) ( sum-square ( cdr seq ))))) a) Ger proceduren upphov till en linjärrekursiv eller iterativ process? Varför? Motivera kortfattat, max två meningar. (1p) b) Visa hur evaluering av (sum-square (5)) går till med hjälp av substitutionsmodellen. (1p) c) Skriv en version enligt den andra processmodellen (om linjärrekursiv, skriv en iterativ, och vice versa). (2p) Uppgift 5. Högre ordningens procedurer (2 poäng) Skriv en funktion i Scheme min-of-f-and-g-at-x som tar två numeriska funktioner f och g och ett tal x som argument och returnerar det minsta av värdena f(x) och g(x). I din lösning, får du - om du så önskar - använda inbyggda funktionen min i Scheme som returnerar det minsta av sina argument. (define square (lambda (x) (* x x))) (define cube (lambda (x) (* x x x))) > (min-of-f-and-g-at-x square cube -1) -1 > (min-of-f-and-g-at-x square cube 2) 4 5
Uppgift 6. Abstrakt datatyp och problemlösning (5 poäng) Vi vill implementera en dataabstraktion som kallas för binärträd. Ett binärträd kan här vara ett tomt träd eller en struktur som består av tre delar: ett värde, samt vänster och höger delträd (barnen). I namnen föreslagna nedan använder vi bt som förkortning för binärträd. Följande figur visar en grafisk representation av ett litet binärträd. Man brukar också säga att ett sådant träd har noder och bågar. Noderna visas här som cirklar och bågarna som linjer som sammankopplar noderna. Man använder även begreppet barn för de noder som är direkt kopplade till en nod och finns under noden. T ex säger man att noden med värdet har två barn, noden med värdet 1 och noden med värdet 10. Nod 10 har ett barn och noderna 1 och 15 har inga barn. 1 10 15 OBS! I din lösning till 6b nedan kan du anta att de funktioner som implementerar ett binärträd enligt 6a finns och fungerar som de skall. Detta även om du inte har en korrekt/fullständig lösning till 6a. Uppgift 6a) Representation (2p) Du får själv välja hur den interna representationen av trädet ser ut. Följande ska dock implementeras: Konstruktorn (make-bt left value right) som skapar ett binärt träd. left och right antas vara delträd. Predikatet (empty-bt? ej. tree) som testar om tree är det tomma trädet eller Konstanten null-bt som representerar det tomma trädet. hur du representerar ett tomt träd. Även här får du välja Följande getters: (bt-left bt), (bt-right bt), (get-value bt) för inre noder. Här är ett exempel på hur det ska fungera (här skapar vi trädet i figuren ovan): 6
(make-bt (make-bt empty-bt 1 empty-bt) (make-bt empty-bt 10 (make-bt empty-bt 15 empty-bt))) 7
Uppgift 6b) Användning (p) Ovan har vi definierat ett binärträd (binärt eftersom varje nod har som mest 2 barn/delträd). Ett binärt sökträd är ett binärträd som är ordnat på detta vis: varje nod har ett värde. Alla värden i vänster delträd är mindre än detta värde och alla värden i höger delträd är större. Om vi har hittat ett träd med värde 5 och letar efter talet 7, kommer det alltså att finnas i höger delträd (om det alls finns). Ett värde förekommer som mest en gång. Trädet i 6a är ett exempel på ett binärt sökträd. Din uppgift är att skriva en funktion (insert tree new-value) som tar ett värde och ett binärt sökträd, och returnerar ett nytt binärt sökträd som innehåller värdet. Exempel Betrakta trädet i uppgift 6a. Om vi sätter in värdet 8 i det, får vi alltså ett träd som ser ut som följer: 1 10 8 15 Sätter vi in 2 i detta träd, får vi givetvis 1 10 2 8 15 Använd abstraktionen beskriven i 6a. 8