UPPSALA UNIVERSITET Matematiska institutionen Salling (070-6527523) SKRIVTID: 9-13 HJÄLPMEDEL: Inga. PROV I MATEMATIK Algoritmik 14 april 2012 Svar/lösningar skall åtföljas av förklarande text. För godkänt prov krävs minst 18 p, och för väl godkänt 28 p. 1. a) (2p) Hur ser det binära träd ut vars postordningstraversering ges av 3 x y + ÿ 2 z + 5 ÿ + b) (1p) Konstruera med hjälp av Add och Mult en funktion som beräknar det aritmetiska uttryck som trädet beskriver. + al. 3 + +. 5 bl AddHMultH3, AddHx, yll, MultHAddH2, zl, 5LL x y 2 z 2. (5p) Red ut huruvida de två funktionerna nedanför beräknar samma sak eller ej. Glöm inte bort att motivera! f H0L = 2 ghxl = AddHMultH3, xl, 2L f IÖkaHxLM = Add Hf HxL, 3L ghxl = 3 x + 2 för alla x. Härav, ghx + 1L = 3 Hx + 1L + 2 = 3 x + 2 + 3 = ghxl + 3. Dvs. giökahxlm = Add HgHxL, 3L. ghxl Således har g samma rekursiva beskrivning som f. Bottenvärdena är också lika: f H0L = gh0l = 2. Det följer att f och g beräknar samma sak. 3. (5p) Provkör den Booelska stenhögsproceduren nedanför på n = 0, 1, 2, 3, 4. Vilken fråga besvarar proceduren för ett godtyckligt n? Ärtig? n i s = Töm m Sålänge m < n 8 m n? i s Addera 3 till m< Proceduren undersöker om n ligger i treans multiplikationstabell, dvs. om n är delbar med 3. MOTIVERING Undersökningen går till på följande sätt: Om n = 0, så körs inte sålänge-slingan, och därmed kommer likhetstestet (som nu har formen 0 0?) att ge svaret ja, vilket är ett korrekt svar, eftersom 0 ligger i treans tabell.
0 0?) att ge svaret ja, vilket är ett korrekt svar, eftersom 0 ligger i treans tabell. Om n > 0, så körs slingan en eller flera gånger, och inuti densamma tillverkas tal m = 3, 6, 9, osv. ur treans tabell. Eftersom det sist tillverkade m:et får slingan att stanna måste det vara lika med det först påträffade talet ur treans tabell som inte är mindre än n. Antag nu att n ligger i treans tabell. Då kan de tal i treans tabell som är mindre än n skrivas m = 0, 3, 6,, n - 3. Nästkommande m (det som får slingan att stanna) blir i detta fall lika med n. Därvid kommer likhetstestet (som nu har formen n n?) att ge svaret ja. Antag till sist att n inte ligger i treans tabell. Det närmsta talet till vänster om n som ligger i treans tabell är nu lika med n - 1 eller n - 2. (Eftersom vart tredje tal ligger i treans tabell, måste något av de tre talen n - 2, n - 1, n ligga i nämnda tabell!) Då kan de tal i treans tabell som är mindre än n skrivas m = 0, 3, 6,, n - 2, eller m = 0, 3, 6,, n - 1. Nästkommande m blir därför lika med n + 1 eller n + 2. Därvid kommer likhetstestet (som nu har formen n + 1 n? eller n + 2 n?) att ge svaret nej. 2 4. (6p) Funktionen papiipap definieras av papiipaph@ DL = @ D papiipaph@nod LDL = FogaInHnod, FogaTillHpapiipapHLL, nodll (a) Visa (med provkörning) vad papiipaph@a bdl blir. (b) Förklara vad papiipap returnerar för en godtycklig inputlista. (a) papiipaph@a bdl = FogaInHa, FogaTillHpapiipapH@bDL, all = FogaInHa, FogaTillHFogaInHb, FogaTillHpapiipapH@ DL, bll, all = FogaInHa, FogaTillHFogaInHb, FogaTillH@ D, bll, all = FogaInHa, FogaTillH@b b D, all = @a b b ad (b) papiipap returnerar sammanfogningen av inputlistan och en reverserad kopia av densamma. MOTIVERING: Det stämmer (enligt basfallet) för tom inputlista. Och för en längre inputlista @a 1 a 2 a n D så är papiipaph@a 1 a 2 a 3 a n DL = @a 1 papiipaph@a 2 a 3 a n DL a 1 D = @a 1 a 2 papiipaph@ a 3 a n DL a 2 a 1 D = @a 1 a 2 a 3 a n papiipaph@ DL a n a 3 a 2 a 1 D = @a 1 a 2 a 3 a n a n a 3 a 2 a 1 D
3 5. (6p) Låt X = @x 0 x 1 x n D och Y = @y 0 y 1 y n D vara två lika långa listor. Konstruera funktionerna BlandaInNollor och Blanda så att (a) BlandaInNollorHXL = @x 0 0 x 1 0 x n 0D, (b) BlandaHX, Y L = @x 0 y 0 x 1 y 1 x n y n D. BlandaInNoll HnilL = nil HaL ; BlandaInNoll H @x X DL = @x @0 BlandaInNoll HXLDD Blanda H nil, nill = nil HbL ; Blanda H @x X D, @y Y DL = @x @y Blanda HX, Y LDD 6. (5p) Antag att X, Y är atomära listor av tal. Konstruera en funktion Differensen HX, Y L som returnerar de tal (paketerade i en lista) som finns i X men inte i Y. T.e.x. så att DifferensenH@5 2 5D, @2 5 1DL = @ D, och DifferensenH@2 5 1 2 1 3D, @2 5 5DL = @1 3D. Du får använda dig av funktionen Tillhör Hx, LL som undersöker ifall x tillhör listan L. DifferensenH nil, Y L = nil DifferensenH @x X D, Y L = OmHInteHTillhörHx, Y LL, @x DifferensenHX, Y LD, DifferensenHX, Y LL KOMMENTAR: Om den vänstra listans första element inte tillhör den högra listan skall nämnda element finnas med i differensen, och annars skall den inte göra det. Eventuella övriga element i differensen ges av differensen mellan vänstra listans återstod och den högra listan.
4 7. (5p) I ett fullständigt k-ställigt träd har varje förälder k stycken barn, och föräldrar på samma nivå är rötter till lika djupa underträd. Nedanför är två fullständiga träd ritade: ett 2-ställigt och ett 3-ställigt (båda med djupet 3). Komponera funktionen Fullständigt?Hk, TL så att den besvarar frågan Är T ett fullständigt k- ställigt träd? Du får använda dig av funktionerna TrädDjup och SkogsDjup som returnerar antalet nivåer i ett träd, respektive antalet nivåer i en skogs djupaste träd. Fullständigt?Hk, @rotdl = 1 Fullständigt?Hk, @rot skogdl = OchHLikaHLängdHskogL, kl, FullständigSkog?Hk, skogll FullständigSkog?Hk, @träddl = Fullständigt?Hk, trädl FullständigSkog?Hk, @träd skogdl = OchHLikaHTrädDjupHträdL, SkogsDjupHskogLL, OchHFullständigt?Hk, trädl, FullständigSkog?Hk, skoglll KOMMENTAR: Ett träd är fullständigt och k-ställigt, om skogen under roten innehåller k träd, som alla är lika djupa och dessutom är fullständiga och k-ställiga. Om trädet bara innehåller en rotnod, finns det inga föräldrar, med följd att ett sådant träd är fullständigt och k-ställigt oavsett k-värde. (Se basfallet.) Funktionen FullständigSkog?Hk, skogl undersöker om träden i skog är lika djupa och dessutom är fullständiga och k-ställiga. Ifall skogen bara innehåller ett träd, räcker det att konstrollera att trädet ifråga är fullständigt och k-ställigt. (Se basfallet.)
5 8. (5p) Låt oss kalla ett binärt träd T för balanserat, om det för varje nod i T skiljer högst en enhet mellan trädjupen hos nodens två underträd. Konstruera en funktion som undersöker om ett binärt träd är balanserat. T.ex. är de första två binära träden nedanför balanserade, men inte det tredje eftersom det innehåller en nod x, vars vänstra underträd har djupet 2 medan det högra (som är tomt) har djupet 0. x BalanseratH@ DL = 1; BalanseratH@rot vä hödl = OchH OchHBalanseratHväL, BalanseratHhöLL, MindreHSkillnadHDjupetHväL, DjupetHhöLL, 2L L där SkillnadHx, yl = OmHStörreHx, yl, SubHx, yl, SubHy, xll KOMMENTAR: Ett obalanserat binärt träd kännetecknas av att det har någon nod vars två underträd skiljer sig i djup med minst två enheter. Det följer att ett tomt binärt träd är balanserat (eftersom det saknar noder). Ett icketomt binärt träd är balanserat om vänster- och höger underträd (till roten) är balanserade, och deras djup skiljer sig åt med mindre än två enheter.