tentamen i dva 201 funktionell programmering med f
tentamen i dva 201 funktionell programmering med f
tentamen i dva 201 funktionell programmering med f
Transform your PDFs into Flipbooks and boost your revenue!
Leverage SEO-optimized Flipbooks, powerful backlinks, and multimedia content to professionally showcase your products and significantly increase your reach.
TENTAMEN I DVA <strong>201</strong> FUNKTIONELL PROGRAMMERING MED F#<br />
Torsdagen den 11 augusti <strong>201</strong>1, kl 8:10 – 12:30<br />
Kurslitteratur är inte tillåten, och inte eller andra hjälp<strong>med</strong>el som på något sätt kan ersätta kurslitteraturen (t.ex.<br />
egna anteckningar, andra böcker i ämnet, kopior av OH-bilder, datorer eller räknare <strong>med</strong> dito lagrad information).<br />
Endast generella hjälp<strong>med</strong>el är tillåtna, som räknare utan lagrad information av betydelse för kursen, ordbok, allmän<br />
formelsamling och liknande. För godkänt krävs 15 poäng, max är 30 poäng. Resultatet offentliggörs senast torsdagen<br />
den 1 september <strong>201</strong>0.<br />
Vänligen observera följande:<br />
• Motivera alltid dina svar. Bristande motivering kan ge poängavdrag. Omvänt kan även ett felaktigt svar ge poäng,<br />
om det framgår av motiveringen att tankegången ändå är riktig.<br />
• Skriv tydligt!<br />
• Varje blad skall vara försedd <strong>med</strong> uppgiftsnummer, bladnummer och anonymkod.<br />
• Endast en uppgift på ett och samma blad.<br />
• Skriv enbart på ena sidan av ett blad.<br />
• Uppgifterna är inte nödvändigtvis sorterade i svårighetsgrad. Om du kör fast kan det löna sig att gå vidare till<br />
nästa uppgift.<br />
• Lösningsförslag kommer att finnas på kursens hemsida efter att tentan är slut.<br />
Frågor: Björn Lisper på 021-151709.<br />
UPPGIFT 1 (5 POÄNG)<br />
Deklarera en funktion factors som tar ett positivt heltal större än ett och returnerar en lista av faktorerna i heltalet.<br />
T.ex. så ska gälla att factors 75 = [3;5;5].<br />
Ledning: operatorn “%” i F# returnerar resten vid heltalsdivision, t.ex. 17 % 3 = 2.<br />
UPPGIFT 2 (7 POÄNG)<br />
Kvadratsumman av en följd av tal a1, . . . , an är n<br />
i=1 a2 i .<br />
a) Deklarera en F#-funktion som beräknar kvadratsumman av en följd flyttal, lagrade i en lista. Lösningen får inte<br />
använda sidoeffekter. För att få full poäng ska din lösning utnyttja F#:s inbyggda högre ordningens funktioner på ett<br />
vettigt sätt. (4p)<br />
b) Deklarera en funktion som beräknar kvadratsumman men genom att använda sidoeffekter på ett vettigt sätt. (3p)<br />
UPPGIFT 3 (2 POÄNG)<br />
Förklara vad problemet är <strong>med</strong> följande F#-deklarationer:<br />
let a = 4711.3<br />
let b = a + 17<br />
1
Vad händer om man försöker kompilera dessa?<br />
UPPGIFT 4 (6 POÄNG)<br />
a) Deklarera en F#-datatyp för binära träd där data kan lagras både i löven och i de interna noderna. För full poäng<br />
måste din datatyp vara polymorf – man ska kunna lagra data av godtycklig typ i trädet. (2p)<br />
b) Deklarera en funktion treeMap som är motsvarigheten för de binära träden i a) till map på listor: treeMap<br />
ska ta en funktion och ett träd som argument, och ska returnera ett likformigt träd där funktionen har applicerats på<br />
alla värden som är lagrade i argument-trädet. (4p)<br />
UPPGIFT 5 (3 POÄNG)<br />
List.tryFind är en standardfunktion i F# som tar ett predikat och en lista som argument. List.tryFind p l<br />
returnerar Some x för det första element x i listan l sådant att p x är sant, eller None ifall något sådant element inte<br />
finns i l. För sekvenser finns det en motsvarande funktion Seq.tryFind. Betrakta nu anropen<br />
List.tryFind (fun x -> x = 3) [1 .. 10000000]<br />
och<br />
Seq.tryFind (fun x -> x = 3) { 1 .. 10000000 }<br />
Bägge kommer att leta upp elementet 3, i listan respektive sekvensen, samt returnera Some 3. Men om man utför<br />
anropen kommer man att märka att någonting skiljer sig åt markant. Vad för något, och varför? en korrekt motivering<br />
krävs för full poäng.<br />
UPPGIFT 6 (3 POÄNG)<br />
Deklarera en funktion i F# som tar en lista av strängar och returnerar den sträng som resulterar om man konkatenerar<br />
alla strängar i listan i den ordning de förekommer. T.ex. för listan ["abc";"xyz";"tuv"] ska funktionen returnera<br />
["abcxyztuv"].<br />
UPPGIFT 7 (4 POÄNG)<br />
Funktionen pairify definieras av:<br />
let rec pairify l =<br />
match l with<br />
| x::xs -> (x,x) :: pairify xs<br />
| [] -> []<br />
Härled en typ för pairify! För full poäng ska den härledda typen vara den mest generella. Ordentlig motivering<br />
krävs.<br />
2<br />
Lycka till! Björn