02.09.2013 Views

tentamen i dva 201 funktionell programmering med f

tentamen i dva 201 funktionell programmering med f

tentamen i dva 201 funktionell programmering med f

SHOW MORE
SHOW LESS

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

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!