Programkonstruktion och datastrukturer. Moment 6 Om generella datastrukturer och träd. PKD 2012/13 moment 6 Sida 1 Uppdaterad

Storlek: px
Starta visningen från sidan:

Download "Programkonstruktion och datastrukturer. Moment 6 Om generella datastrukturer och träd. PKD 2012/13 moment 6 Sida 1 Uppdaterad"

Transkript

1 Programkonstruktion och datastrukturer Moment 6 Om generella datastrukturer och träd PKD 2012/13 moment 6 Sida 1 Uppdaterad

2 Tabeller En viktig tillämpning är tabellen att ifrån en nyckel kunna ta fram ett tabellvärde. Ett typiskt exempel är en telefonkatalog: Avdelningen för datalogi Bol, Roland, universitetslektor, 7606 Eriksson, Lars-Henrik, universitetslektor, 1057 Flener, Pierre, universitetslektor, 1028 Åman Pohjola, Johannes, doktorand, 1030 nyckel värde PKD 2012/13 moment 6 Sida 2 Uppdaterad

3 Implementering av tabellen En tabell implementeras naturligen som en lista: val datalogi = [("Bol, Roland",("universitetslektor",7606)), ("Eriksson, Lars-Henrik", ("universitetslektor",1057)), ("Flener, Pierre",("professor i datalogi",1028)), ("Åman Pohjola, Johannes",("doktorand",1030))] : (string * (string*int)) list; nyckeltyp värdetyp Listans typ blir alltså (nyckeltyp*värdetyp) list En invariant är att varje nyckel förekommer högst en gång. PKD 2012/13 moment 6 Sida 3 Uppdaterad

4 Operationer på tabellen Skapa en tom tabell (empty) Lägg in en uppgift i tabellen (insert) Kontrollera om en nyckel finns i en tabell (exists) Hämta ett värde från tabellen (search) Tag bort en uppgift från tabellen (delete) (Fler operationer är tänkbara, vi kommer att diskutera några till, men nöjer oss med dessa just nu.) Exempel: search(datalogi, "Bol, Roland") = ("universitetslektor",7606) exists(datalogi, "Anka, Kalle") = false PKD 2012/13 moment 6 Sida 4 Uppdaterad

5 Tabellprogrammet exists (* exists(t,k) TYPE: (''a*'b) list * ''a -> bool PRE: T är en korrekt tabell. POST: true om nyckeln k finns i tabellen T, false annars. *) (* VARIANT: längden hos T *) fun exists([], _) = false exists((key',value)::rest,key) = key = key' orelse exists(rest,key); PKD 2012/13 moment 6 Sida 5 Uppdaterad

6 Tabellprogrammet search (* search(t,k) TYPE: (''a*'b) list * ''a -> 'b PRE: T är en korrekt tabell. Nyckeln k finns i tabellen T. POST: Värdet som hör ihop med nyckeln k i tabellen T. *) (* VARIANT: längden hos T *) fun search((key',value)::rest,key) = if key = key' then value else search(rest,key); Var är basfallet i rekursionen? PKD 2012/13 moment 6 Sida 6 Uppdaterad

7 Tabellprogrammet empty, insert val empty = []; (* insert(t,k,v) TYPE: (''a*'b) list * ''a * 'b -> (''a*'b) list PRE: T är en korrekt tabell. POST: Tabellen T uppdaterad med värdet v för nyckeln k *) (* VARIANT: längden av T *) fun insert([], key, value) = [(key,value)] insert((key',value')::rest, key, value) = if key = key' then (key,value)::rest else (key',value')::insert(rest,key,value); Observera att insert respekterar datastrukturinvarianten att varje nyckel förekommer högst en gång i tabellen. PKD 2012/13 moment 6 Sida 7 Uppdaterad

8 Tabellprogrammet delete (* delete(t,k) TYPE: (''a*'b) list * ''a -> (''a*'b) list PRE: T är en korrekt tabell. POST: Tabellen T med uppgiften om nyckeln k borttagen *) * VARIANT: längden av table *) fun delete([], key) = [] delete((key',value)::rest, key) = if key = key' then rest else (key',value)::delete(rest, key); Observera att även delete respekterar datastrukturinvarianten. PKD 2012/13 moment 6 Sida 8 Uppdaterad

9 Tabelltyper Observera att tabellfunktionerna alla blir polymorfa: empty : (''a*'b) list search : (''a*'b) list * ''a -> 'b exists : (''a*'b) list * ''a -> bool insert : (''a*'b) list * ''a * 'b -> (''a*'b) list delete : (''a*'b) list * ''a -> (''a*'b) list Anledningen är att programmet aldrig utför någon operation på nycklar eller värden (bara likhetsjämförelser på nycklar) och därför inte bryr sig om vilka typer dessa har. Tabellerna får alltså typer på formen (''a*'b) list. Exempeltabellen hade typen (string*(string*int)) list, vilket är en instans av den polymorfa tabelltypen ovan. PKD 2012/13 moment 6 Sida 9 Uppdaterad

10 Tabellkomplexitet En tabell med n nycklar representeras av en lista med n element. Värsta fallets tidskompexitet för search är Theta(n). Bästa fallet är Theta(1). För att slå i tabellen måste man i genomsnitt söka igenom halva listan dvs n/2 rekursiva anrop av search. Genomsnittsfallets tidskomplexitet är alltså också Theta(n). En lista med en miljon nycklar kräver i genomsnitt anrop av lookup för att göra en tabellslagning. Detta är inte bra i praktiken. Samma resonemang gäller exists, insert och delete. Verkar det teoretiskt möjligt att implementera tabeller så att komplexiteten blir lägre? PKD 2012/13 moment 6 Sida 10 Uppdaterad

11 Sammanblandning av representerade data I en tillämpning behöver man använda koder för veckodagar, t.ex. 1 måndag, 2 tisdag, etc. För att göra programmet mera lättläst och oberoende av de specifika koderna namnger man dem (definitionsabstraktion): val Mon = 1; (* Monday *) val Tue = 2; (* Tuesday *) val Wed = 3; (* Wednesday *) etc Koderna är nu tal och de går att räkna med (Wed*2), men de representerar egentligen veckodagar, som inte skall gå att räkna med. ML blir i praktiken otypat vad beträffar tal och veckodagar. PKD 2012/13 moment 6 Sida 11 Uppdaterad

12 Vad definitionsabstraktion inte kan göra Felaktiga mönster: Hopblandning av data: (* weekend d (* overtimepay(d,x) TYPE: int->bool TYPE: int*int->int PRE: d är en korrekt dag PRE: d är en korrekt dag. POST: true om d är en POST: Timlönen veckodagen veckoslutsdag (lö/sö), d med hänsyn false annars *) till övertid om grundtimlönen är x. *) fun weekend Sat = true ajaj... weekend Sun = true ajaj... fun overtimepay(d,x) = weekend _ = false; ujuj... if weekend d then d * 2 ujuj... Felaktigt värde: weekend(8) ojoj... else x; Sat, Sun är identifierare vilka som helst de binds i mönster. PKD 2012/13 moment 6 Sida 12 Uppdaterad

13 Uppräkningstyper datatype weekday = Mon Tue Wed Thu Fri Sat Sun; weekday blir en helt ny datatyp med de angivna värdena. (* weekend d (* overtimepay(d,x) TYPE: weekday->bool TYPE: weekday*int->int PRE: (inget) Obs! PRE: (inget) Obs! POST: true om d är en POST: Timlönen veckodagen veckoslutsdag (lö/sö), d med hänsyn false annars *) till övertid om grundtimlönen är x. *) fun weekend Sat = true Ok! weekend Sun = true Ok! fun overtimepay(d,x) = weekend _ = false; if weekend d then Felaktigt värde: d * 2 else Typfel! weekend(8) Typfel! x; Sat, Sun är värden som true, false de binds inte i mönster. PKD 2012/13 moment 6 Sida 13 Uppdaterad

14 Konvertering av uppräkningstyper datatype weekday = Mon Tue Wed Thu Fri Sat Sun; ML definierar ingen speciell ordning av värdena i weekday. Inte heller finns något inbyggt sätt att omvandla dem till/från heltal som man t.ex. kan med tecken (ord, chr). Sådant får man göra själv... (* daynumber d (* numberday n TYPE: weekday->int TYPE: int->weekday PRE: (inget) PRE: 1 <= n <= 7 POST: ordningstalet POST: veckodagen med för veckodagen d *) ordningstal n *) fun daynumber Mon = 1 fun numberday 1 = Mon daynumber Tue = 2 numberday 2 = Tue daynumber Wed = 3 numberday 3 = Wed daynumber Thu = 4 numberday 4 = Thu daynumber Fri = 5 numberday 5 = Fri daynumber Sat = 6 numberday 6 = Sat daynumber Sun = 7; numberday 7 = Sun numberday _ = raise Domain; PKD 2012/13 moment 6 Sida 14 Uppdaterad

15 Vissa inbyggda typer kan definieras datatype bool = true false; datatype unit = (); Dessa datatyper är fördefinierade i ML och kan inte definieras igen, men de fungerar som om de definierats på detta sätt. PKD 2012/13 moment 6 Sida 15 Uppdaterad

16 Sammanblandning av representerade data Rationella tal (se exempel tidigare i kursen) har speciella egenskaper och borde ha en egen typ. Ex.vis. heltalsvektorer (punkter i rutnät eller matriser) representeras också naturligt som int*int-tupler likadant som rationella tal. Fastän datastrukturen är samma är egenskaperna helt annorlunda.t.ex. utförs addition av vektorer komponentvis (1,2) + (1,3) = (2,5) ML-program blir i praktiken otypade beträffande dessa sorters data. Risk för sammanblanding: addition av vektorer med qadd eller blandning av rationella tal och vektorer. PKD 2012/13 moment 6 Sida 16 Uppdaterad

17 Konstruerade (taggade) typer Med deklarationen datatype kan man skapa nya typer som skiljer sig från alla andra: datatype intvec = Intvec of int*int; datatype rational = Q of int*int; intvec och rational är nu helt nya datatyper som båda innehåller en int*int-tupel men som har en etikett (tag) som skiljer dem åt. Värden av typen intvec skrivs föregångna av konstruktorn Intvec, t.ex. Intvec(1,2). Samma med rationella tal, t.ex. Q(1,2). Jämför konstruktorn :: som skapar en listcell. PKD 2012/13 moment 6 Sida 17 Uppdaterad

18 Användning av konstruerade typer Man kan betrakta en värde av en konstruerad datatyp som ett kuvert med konstruktorn påskriven, i vilken man har stoppat ned de data som ingår i värdet. Q (1,2) Försök att blanda ihop en heltalsvektor och ett rationellt tal ger typfel eftersom ML kan se på konstruktorerna att de hör till olika typer. Intvec och Q har funktionstyper: Intvec:int*int->intvec Q:int*int->rational och ser ut och kan användas som funktioner men är inte funktioner i vanlig mening eftersom de inte utför någon beräkning. De skapar ett nytt värde på samma sätt som den infixa konstruktorn ::. PKD 2012/13 moment 6 Sida 18 Uppdaterad

19 Användning av konstruerade typer För att komma åt delarna i ett värde av en konstruerad typ måste de tas ut ur kuvertet. För detta använder man matchning på liknande sätt som man matchar på listceller med ::. Nya värden av konstruerad typ kan skapas genom att ge uttryck som beräknas som argument till konstruktorn. (* qadd(x,y) TYPE: rational*rational->rational PRE: x och y skall vara korrekta rationella tal (dvs nämnaren skall vara 0). POST: Summan av x och y EX: qadd(q(1,2),q(1,3)) = Q(5,6) *) fun qadd(q(p1,q1),q(p2,q2)) = Q(p1*q2+p2*q1,q1*q2); PKD 2012/13 moment 6 Sida 19 Uppdaterad

20 Typsystemet förhindrar sammanblandning > qadd(q(1,2),q(1,3)); val it = Q (5,6) : rational - qadd(intvec(1,2),intvec(1,3)); Error-Type error in function application. Function: qadd : rational * rational -> rational Argument: (Intvec(1,2),Intvec(1,3)):intvec*intvec Reason: Can't unify rational with intvec (Different type constructors) Found near qadd (Intvec (1, 2), Intvec (1,...)) PKD 2012/13 moment 6 Sida 20 Uppdaterad

21 Alternativa former för konstruerade typer Formerna hos datatype-deklarationen för uppräkningstyper och konstruerade typen kan kombineras! datatype number = Int of int Real of real; Ett värde i number är antingen ett heltal med etiketten Int eller ett flyttal med etiketten Real. Tack vare att etiketten skiljer kan man alltid veta om det handlar om ett heltal eller ett flyttal. Användning: Om man vill ha värden med olika form (utseende). Om man vill ha funktioner som kan ha olika typer som argument eller värde. (Namnet Int ovan är valt av mig för att vara likt int, men det finns ingen koppling mellan dem i ML. Samma gäller Real och real.) PKD 2012/13 moment 6 Sida 21 Uppdaterad

22 Kombinerade typer Typen number kan innehålla ett heltal eller ett flyttal. Vid addition av number konverteras termerna automatiskt till flyttal om det behövs. (* toreal n TYPE: number -> number POST: Talet n konverterat till flyttal EX: toreal (Int 30) = Real 30.0 *) fun toreal (Real r) = Real r toreal (Int i) = Real (real i); (* addnumbers(x,y) TYPE: number*number->number POST: summan av x och y, heltal konverteras till flyttal om det behövs. EX: addnumbers(int 30, Real 2.0) = Real 32.0 *) fun addnumbers(int x, Int y) = Int (x+y) addnumbers(x,y) = let val Real xr = toreal x; val Real yr = toreal y in Real (xr+yr) end; PKD 2012/13 moment 6 Sida 22 Uppdaterad

23 Exempel: Representation av fordon Vi definierar en datatyp för att beskriva olika fordon. Vi anger för: bilar: reg.beteckning, färg och motorstyrka cyklar: färg och hjuldiameter skateboard: färg datatype vehicle = Car of string*string*int Bicycle of string*int Skateboard of string; Olika värden av typen vehicle: Car("XYZ123","green",100) Bicycle("red",26) Skateboard "silver" PKD 2012/13 moment 6 Sida 23 Uppdaterad

24 Exempel: räkna fordon av viss färg (* vehiclecolour vehicle TYPE: vehicle->string POST: Färgen hos vehicle. EX: vehiclecolour(bicycle("green",24)) = "green" *) fun vehiclecolour (Car(_,colour,_)) = colour vehiclecolour (Bicycle(colour,_)) = colour vehiclecolour (Skateboard colour) = colour; (* countcolourvehicles(colour,vehicles) TYPE: string*vehicle list->int POST: antal fordon i vehicles med färgen colour. EX: countcolourvehicles("green", [Car("XYZ123","green",100),Skateboard "silver", Bicycle("green",24)]) = 2 *) (* VARIANT: length vehicles *) fun countcolourvehicles(_,[]) = 0 countcolourvehicles(colour,vehicle::rest) = (if vehiclecolour vehicle = colour then 1 else 0)+ countcolourvehicles(colour,rest); PKD 2012/13 moment 6 Sida 24 Uppdaterad

25 Intern dokumentation av datatyper Inte bara funktioner utan också konstruerade datatyper behöver dokumenteras. Varje datatype skall förses med en kommentar liknande en funktionsspecifikation som har två delar: En beskrivning av hur data är representerat Datastrukturinvarianten datatype rational = Q of int*int; (* REPRESENTATION CONVENTION: Ett rationellt tal representeras som Q(t,n) där t är täljaren och n är nämnaren. REPRESENTATION INVARIANT: Nämnaren får inte vara 0. *) PKD 2012/13 moment 6 Sida 25 Uppdaterad

26 Polymorfa datatyper En eller flera komponentdatatyper i en konstruerad datatyp kan vara en typvariabel: datatype 'a option = NONE SOME of 'a option blir här en typkonstruktor precis som list och vector. Instansen int option är en typ med två slags värden: Konstanten NONE. Ett heltal taggat med konstruktorn SOME. Exempel på värden av typen int option: NONE, SOME 4, SOME ~2, SOME 0 Exempel på värden av typen string option: NONE, SOME "Hej", SOME "", SOME "ABC" PKD 2012/13 moment 6 Sida 26 Uppdaterad

27 Användning av option option är en inbyggd typkonstruktor i ML. Den används t.ex. när man vill ha ett bättre sätt att hantera felsituationer i programmet än att avbryta körningen eller göra något odefinierat. (* sumuptoopt n Type: int->int option Post: SOME s, där s är summan av talen 0...n om n>=0. NONE annars. Ex: sumuptoopt 4 = SOME 10, sumuptoopt ~2 = NONE *) (* Variant: n *) fun sumuptoopt n = if n < 0 then NONE else if n = 0 then SOME 0 else SOME(n+valOf(sumUpToOpt(n-1))); Förvillkor saknas jämför med defensiva sumupto i kursmoment 4! (valof är en inbyggd funktion i ML: fun valof(some x) = x) PKD 2012/13 moment 6 Sida 27 Uppdaterad

28 En annan användning av option (* safesearch(t,k) TYPE: (''a*'b) list * ''a -> 'b option PRE: T är en korrekt tabell. POST: SOME av värdet som hör ihop med nyckeln k i tabellen T om ett nyckeln finns i T NONE annars. *) (* VARIANT: längden hos T *) fun safesearch([], _) = NONE safesearch((key',value)::rest,key) = if key = key' then SOME value else safesearch(rest,key); Notera förvillkoret! PKD 2012/13 moment 6 Sida 28 Uppdaterad

29 Rekursiva typer Komponenterna i en konstruerad datatyps värde får höra till datatypen själv! (En rekursiv typ.) En listcell head tail cons-cell kan definieras som en konstruerad datatyp som innehåller en tupel med två komponenter för head resp. tail: datatype 'a list = [] :: of 'a*'a list; Listor i ML fungerar exakt som om de var definierade med denna deklaration. (Man kan inte göra om deklarationen för att prova ML tillåter inte att man gör en ny deklaration av listor.) PKD 2012/13 moment 6 Sida 29 Uppdaterad

30 Träd Listor kan representera data med linjär struktur t.ex. förteckningar och sekvenser. Ofta har dock data trädstruktur, t.ex. i ett släktträd: delträd rot gren noder Mattias Annika Lars-Henrik Yvonne Karl-Gustaf Birgit Sverker Detta är ett binärt träd varje nod har maximalt två grenar. Löv är noder som saknar grenar. Roten är trädets början. Djupet hos en nod är avståndet till roten. löv Martin PKD 2012/13 moment 6 Sida 30 Uppdaterad

31 Hur representera ett träd? (Dålig lösning) Varje nod läggs i en lista tillsammans med delträdens rotnoder: [("Mattias","Annika","Lars-Henrik"), ("Annika", "Yvonne", "Karl-Gustaf"), ("Yvonne", "", ""), ("Karl-Gustaf", "", ""), ("Lars-Henrik", "Birgit", "Sverker"), ("Sverker", "", "Martin"), ("Birgit", "", ""), ("Martin", "", "")] : (string*string*string) list + Enkel representation Navigering i trädet kräver sökning i listan. Hur hitta farfar? Vilken nod är rotnoden? Uppdatering av trädet kräver också sökning. Denna representation är inte bra i praktiken! PKD 2012/13 moment 6 Sida 31 Uppdaterad

32 Träddatatyper Binära träd kan representeras direkt i ML som en rekursiv datatyp! datatype familytree = Empty Person of string*familytree*familytree; Mattias Annika Lars-Henrik Yvonne Karl-Gustaf Birgit Sverker Martin Person("Mattias", Person("Annika",Person("Yvonne",Empty,Empty), Person("Karl-Gustaf",Empty,Empty)), Person("Lars-Henrik",Person("Birgit",Empty,Empty), Person("Sverker",Empty, Person("Martin", Empty,Empty)))) PKD 2012/13 moment 6 Sida 32 Uppdaterad

33 Enkel navigering (* farfar t TYPE: familytree -> familytree PRE: Det finns en farfader till rotnoden i t. POST: Delträdet till t där farfadern är rotnod. EX: farfar (Person("Mattias",..., Person("Lars-Henrik",..., Person("Sverker",...,...)))) = Person("Sverker",...,...) *) fun farfar(person(_,_,person(_,_,ff))) = ff; PKD 2012/13 moment 6 Sida 33 Uppdaterad

34 Rekursion över träd Rekursion över träd är normalt dubbel rekursion man måste göra rekursion över båda grenarna från en given nod. (* countpersons t TYPE: familytree -> int PRE: (inget) POST: Antal personer i trädet t EX: countpersons( Person("Ronja",Person("Lovis",Empty,Empty), Person("Mattis",Empty,Empty))) = 3 *) (* VARIANT: Antal noder i trädet t *) fun countpersons Empty = 0 countpersons(person(_,left,right)) = 1 + countpersons Left + countpersons Right; PKD 2012/13 moment 6 Sida 34 Uppdaterad

35 Rekursion över träd (forts.) fun countpersons Empty = 0 countpersons(person(_,left,right)) = 1 + countpersons Left + countpersons Right; countpersons(person("ronja",person("lovis",empty,e mpty), Person("Mattis",Empty,Empty))) > 1+countPersons(Person("Lovis",Empty,Empty)+ countpersons(person("mattis",empty,empty)) > 1+(1+countPersons Empty+countPersons Empty)+ countpersons(person("mattis",empty,empty)) > 1+(1+0+countPersons Empty)+ countpersons(person("mattis",empty,empty)) > 1+(1+countPersons Empty)+ countpersons(person("mattis",empty,empty)) > 1+(1+0)+countPersons > 2+countPersons(Person("Mattis",Empty,Empty)) > 2+(1+countPersons Empty+countPersons Empty) > 3 PKD 2012/13 moment 6 Sida 35 Uppdaterad

36 Syntaxträd Strukturen hos en formel kan beskrivas med ett syntaxträd. 3+2*x-1 : + 1 datatype expr = Const of int Var of string Plus of expr*expr Minus of expr*expr Times of expr*expr Div of expr*expr; Minus(Plus(Const 3,Times(Const 2,Var "x")), Const 1) PKD 2012/13 moment 6 Sida 36 Uppdaterad * x

37 Beräkning av uttryck (* eval(expr,table) TYPE: expr*(string*int) list -> int PRE: Alla variabler i expr finns i table. Ingen division med 0 förekommer i expr. POST: Värdet av expr uträknat. Ex: eval(minus(plus(const 3, Times(Const 2,Var "x")), Const 1), insert([],"x",4)) = 10 *) (* VARIANT: Storleken hos expr. *) fun eval(const c,_) = c eval(var v, T) = search(t,v) eval(plus(e1,e2),t) = eval(e1,t) + eval(e2,t) eval(minus(e1,e2),t) = eval(e1,t) - eval(e2,t) eval(times(e1,e2),t) = eval(e1,t) * eval(e2,t) eval(div(e1,e2),t) = eval(e1,t)div eval(e2,t) PKD 2012/13 moment 6 Sida 37 Uppdaterad

38 Beräkning av uttryck (forts.) eval(minus(plus(const 3,Times(Const 2,Var "x")),const 1),insert([],"x",4)) > eval(minus(plus(const 3,Times(Const 2,Var "x")),const 1),[("x",4)]) > eval(plus(const 3,Times(Const 2,Var "x"))),[("x",4)])-eval(const 1,[("x",4)]) > (eval(const 3,[("x",4)])+eval(Times(Const 2,Var "x"),[("x",4)]))-eval(const 1,[("x",4)]) > (3+eval(Times(Const 2,Var "x"),[("x",4)]))- eval(const 1) > (3+(eval(Const 2,[("x",4)])*eval(Var "x",[("x",4)])))-eval(const 1,[("x",4)]) > (3+(2*eval(Var "x",[("x",4)])))-eval(const 1,[("x",4)]) > (3+(2*search([("x",4)],"x")))-eval(Const 1,[("x",4)]) >... > (3+(2*4))-eval(Const 1,[("x",4)]) > (3+8)-eval(Const 1,[("x",4)]) > 11-eval(Const 1,[("x",4)]) > 11-1 > 10 PKD 2012/13 moment 6 Sida 38 Uppdaterad

39 Teologiska fakulteten Hum.-Sam. vetenskapsområdet Juridiska fakulteten Allmänna träd Uppsala universitet... Språkvet. fakulteten Inst. för IT... Tek.-Nat. vetenskapsområdet Tek.-Nat. fakulteten Inst. för matematik... Inst. för teknikvet. datatype 'a tree = Tree of 'a*('a tree) list; 'a är typen för informationen i varje nod. PKD 2012/13 moment 6 Sida 39 Uppdaterad

40 Exempel på träd datatype 'a tree = Tree of 'a*('a tree) list; Tree("Uppsala universitet", [Tree("Hum.-Sam. vetenskapsområdet", [Tree("Teologiska fakulteten",[]), Tree("Juridiska fakulteten",[]), Tree("Språkvet. fakulteten",[]),...]), Tree("Tek.-Nat. vetenskapsområdet", [Tree("Tek.-Nat. fakulteten"), [Tree("Inst. för IT",[]), Tree("Inst. för matematik",[]), Tree("Inst. för teknikvet.",[]),...])]),...]) : string tree PKD 2012/13 moment 6 Sida 40 Uppdaterad

41 Minns ni analysen av summeringsproblemet? För att summera talen från 0 till n kan jag lösa det enklare problemet att summera från 0 till n-1 och sedan lägga till n! Om n=0 kan jag direkt säga att summan är 0. fun sumupto 0 = 0 sumupto n = sumupto(n-1) + n sumupto 3 > sumupto(3-1)+3 > sumupto 2+3 >(sumupto(2-1)+2)+3 > (sumupto 1+2)+3 > ((sumupto(1-1)+1)+2)+3 > ((sumupto 0+1)+2)+3 > ((0+1)+2)+3 > (1+2)+3 > 3+3 > 6 PKD 2012/13 moment 6 Sida 41 Uppdaterad

42 En annan analys av summeringsproblemet Start. Låt summan vara 0. Är n=0? Ja. Stopp. Nej. Addera n till summan. Subtrahera 1 från n. Konstruktionen kallas för en loop. Här adderar vi det största talet först (n+...+0) och inte det minsta (0+...+n), men det ger samma resultat. (I detta fall!!) PKD 2012/13 moment 6 Sida 42 Uppdaterad

43 Iteration i ML Basfall fun sumupto n = sumuptoaux(n,0) Rekursivt anrop fun sumuptoaux(0,sum) = sum sumuptoaux(n,sum) = sumuptoaux(n-1,sum+n) En hjälpfunktion sumuptoaux implementerar loopen. Tekniken kallas iteration (svansrekursion) och är ett specialfall av rekursion. Argumentet sum kallas för ackumulator. Obs att nya värden för n och sum beräknas samtidigt. sumupto 2 > sumuptoaux(2,0) > sumuptoaux(2-1,0+2) > sumuptoaux(1,2) > sumuptoaux(1-1,2+1) > sumuptoaux(0,3) > 3 PKD 2012/13 moment 6 Sida 43 Uppdaterad

44 Bindningar i iteration fun sumuptoaux(0,sum) = sum sumuptoaux(n,sum) = sumuptoaux(n-1,sum+n) sumuptoaux(2,0) > sumuptoaux(n-1,sum+n)[n >2,sum >0] > sumuptoaux(2-1,sum+n)[n >2,sum >0] > sumuptoaux(1,sum+n) [n >2,sum >0] > sumuptoaux(1,0+n) [n >2,sum >0] > sumuptoaux(1,0+2) [n >2,sum >0] > sumuptoaux(1,2) [n >2,sum >0] > sumuptoaux(n-1,sum+n)[n >1,sum >2] [n >2,sum >0] skuggas bort helt > sumuptoaux(1-1,sum+n)[n >1,sum >2] > sumuptoaux(0,sum+n) [n >1,sum >2] > sumuptoaux(0,2+n) [n >1,sum >2] > sumuptoaux(0,2+1) [n >1,sum >2] > sumuptoaux(0,3) [n >1,sum >2] > 3 PKD 2012/13 moment 6 Sida 44 Uppdaterad

45 Funktionsspecifikationen för sumuptoaux sumuptoaux(n,sum) Type: int*int->int För att rekursionen skall terminera krävs att n inte är mindre än 0: Pre: n>=0 Man kan inte kräva sum=0. Det gäller inte för de rekursiva anropen! Eftervillkoret är inte att sumuptoaux summerar talen 0 till n. Så är den avsedd att användas men det är inte vad den faktiskt gör. Post: Summan av sum och talen från 0 till n. Exempel behövs också... Ex.: sumuptoaux(3,0) = 6 sumuptoaux(4,5) = 15 sumuptoaux(0,2) = 2 Rekursionsvarianten anges som del av programdokumentationen. Variant: n PKD 2012/13 moment 6 Sida 45 Uppdaterad

46 Minnesbehov Rekursion i allmänhet behöver minne i proportion till antalet rekursiva anrop eftersom en del av beräkningen väntar. sumupto 3 > sumupto(3-1)+3 > sumupto 2+3 >(sumupto(2-1)+2)+3 > (sumupto 1+2)+3 > ((sumupto(1-1)+1)+2)+3 > ((sumupto 0+1)+2)+3 > ((0+1)+2)+3 > (1+2)+3 > 3+3 > 6 Uttrycket blir hela tiden större... Programmet kan få slut på minne om de rekursiva anropen är många och/eller kräver mycket minne. PKD 2012/13 moment 6 Sida 46 Uppdaterad

47 Minnesbehov vid iteration Iteration har konstant minnesåtgång. fun sumupto n = sumuptoaux(n,0); fun sumuptoaux(0,sum) = sum sumuptoaux(n,sum) = sumuptoaux(n-1,sum+n) sumupto 3 > sumuptoaux(3,0) > sumuptoaux(3-1,0+3) > sumuptoaux(2,0) > sumuptoaux(2-1,3+2) > sumuptoaux(1,2) > sumuptoaux(1-1,5+1) > sumuptoaux(0,6) > 6 Minnet kan aldrig ta slut (inte pga rekursionen i alla fall). PKD 2012/13 moment 6 Sida 47 Uppdaterad

48 Beräkningsordning i iteration fun foo [] = [] foo(first::rest) = first::foo rest; foo plockar isär en lista men sätter genast ihop den igen! foo [1,2,3,4] = [1,2,3,4] Vad händer om man gör samma sak iterativt? fun revaux([],ack) = ack revaux(first::rest,ack) = revaux(rest,first::ack); fun rev l = revaux(l,[]); Låt oss se rev [1,2,3,4] = [4,3,2,1] revaux gör beräkningen i omvänd ordning jämfört med foo! PKD 2012/13 moment 6 Sida 48 Uppdaterad

49 Vänd på en lista (körexempel) fun revaux([],ack) = ack revaux(first::rest,ack) = revaux(rest,first::ack) fun rev l = revaux(l,[]) rev [1,2,3,4] > revaux([1,2,3,4],[]) > revaux([2,3,4],[1]) > revaux([3,4],[2,1]) > revaux([4],[3,2,1]) > revaux([],[4,3,2,1]) > [4,3,2,1] (rev är en inbyggd funktion i ML för att vända på listor.) PKD 2012/13 moment 6 Sida 49 Uppdaterad

50 Kodningsmönster för iteration Flödesschema för funktionen foo: Kod för funktionen foo: Start. A. Ja. T? C. Stopp. Nej. B. fun foo x = fooaux A fun fooaux x = if T then C else fooaux B Iterativa program är i vissa fall de bästa, men i allmänhet blir programmen lättare att skriva och förstå med vanlig rekursion! PKD 2012/13 moment 6 Sida 50 Uppdaterad

51 Ett mindre snyggt program (* notwins l TYPE: ''a list -> ''a list POST: l med alla följder av samma element ersatta av en enda förekomst. EX: notwins [1,2,2,3,4,4,4] = [1,2,3,4] *) (* VARIANT: length l *) fun notwins [] = [] notwins [x] = [x] notwins (first::rest) = if first = hd rest then notwins rest else first::notwins rest; Här skulle man vilja ha ett mönster som delar upp svansen av argumentet ytterligare så att man inte behöver använda hd. PKD 2012/13 moment 6 Sida 51 Uppdaterad

52 Ett till mindre snyggt program för samma sak (Samma funktionsspecifikation.) fun notwins [] = [] notwins [x] = [x] notwins (first::second::rest) = if first = second then notwins(second::rest) else first::notwins(second::rest); Svansen av argumentet är nu uppdelad i second och rest, men då måste man sätta ihop dem igen i de rekursiva anropen! PKD 2012/13 moment 6 Sida 52 Uppdaterad

53 Mönstret as Med konstruktionen as kan man både binda en datastruktur och matcha den mot ytterligare mönster. fun notwins [] = [] notwins [x] = [x] notwins (first::(rest as second::_)) = if first = second then notwins rest else first::notwins rest; I tredje klausulen kommer svansen på argumentet dels bindas till rest. dels matchas vidare mot mönstret second::_ Då behöver man varken använda hd eller sätta ihop det man redan tagit isär. PKD 2012/13 moment 6 Sida 53 Uppdaterad

Programkonstruktion och datastrukturer. Moment 5 Om generella datastrukturer och träd. PKD 2011/12 moment 5 Sida 1 Uppdaterad

Programkonstruktion och datastrukturer. Moment 5 Om generella datastrukturer och träd. PKD 2011/12 moment 5 Sida 1 Uppdaterad Programkonstruktion och datastrukturer Moment 5 Om generella datastrukturer och träd PKD 2011/12 moment 5 Sida 1 Uppdaterad 2011-11-22 Sammanblandning av representerade data I en tillämpning behöver man

Läs mer

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 8 Om abstrakta datatyper och binära sökträd

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 8 Om abstrakta datatyper och binära sökträd Programmeringsmetodik DV1 Programkonstruktion 1 Moment 8 Om abstrakta datatyper och binära sökträd PK1&PM1 HT-06 moment 8 Sida 1 Uppdaterad 2005-09-22 Tabeller En viktig tillämpning är tabellen att ifrån

Läs mer

Tabeller. Programkonstruktion. Moment 8 Om abstrakta datatyper och binära sökträd. Implementering av tabellen. Operationer på tabellen

Tabeller. Programkonstruktion. Moment 8 Om abstrakta datatyper och binära sökträd. Implementering av tabellen. Operationer på tabellen Programkonstruktion Moment 8 Om abstrakta datatyper och binära sökträd Tabeller En viktig tillämpning är tabellen att ifrån en nyckel kunna ta fram ett tabellvärde. Ett typiskt exempel är en telefonkatalog:

Läs mer

Tabeller. Programkonstruktion. Moment 8 Om abstrakta datatyper och binära sökträd. Specifikationer för tabellfunktionerna. Operationer på tabellen

Tabeller. Programkonstruktion. Moment 8 Om abstrakta datatyper och binära sökträd. Specifikationer för tabellfunktionerna. Operationer på tabellen Programkonstruktion Moment 8 Om abstrakta datatyper och binära sökträd Tabeller En viktig tillämpning är tabeller att ifrån en nyckel kunna ta fram ett tabellvärde. Ett typiskt exempel är en telefonkatalog:

Läs mer

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 4 Om rekursion. PK1&PM1 HT-06 moment 4 Sida 1 Uppdaterad

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 4 Om rekursion. PK1&PM1 HT-06 moment 4 Sida 1 Uppdaterad Programmeringsmetodik DV1 Programkonstruktion 1 Moment 4 Om rekursion PK1&PM1 HT-06 moment 4 Sida 1 Uppdaterad 2006-10-17 Summera godtyckligt antal tal (* sumupto n Type: int->int Pre: n >= 0, n

Läs mer

Programkonstruktion och datastrukturer. Moment 9 Om högre ordningens funktioner. PKD 2010/11 moment 9 Sida 1 Uppdaterad

Programkonstruktion och datastrukturer. Moment 9 Om högre ordningens funktioner. PKD 2010/11 moment 9 Sida 1 Uppdaterad Programkonstruktion och datastrukturer Moment 9 Om högre ordningens funktioner PKD 2010/11 moment 9 Sida 1 Uppdaterad 2010-12-02 Anonyma funktioner igen En funktion som inte är namngiven kallas för en

Läs mer

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 9 Om högre ordningens funktioner. PK1&PM1 HT-06 moment 9 Sida 1 Uppdaterad

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 9 Om högre ordningens funktioner. PK1&PM1 HT-06 moment 9 Sida 1 Uppdaterad Programmeringsmetodik DV1 Programkonstruktion 1 Moment 9 Om högre ordningens funktioner PK1&PM1 HT-06 moment 9 Sida 1 Uppdaterad 2006-09-06 Anonyma funktioner igen En funktion som inte är namngiven kallas

Läs mer

Programkonstruktion och datastrukturer. Moment 9 Om högre ordningens funktioner. PKD 2011/12 moment 9 Sida 1 Uppdaterad

Programkonstruktion och datastrukturer. Moment 9 Om högre ordningens funktioner. PKD 2011/12 moment 9 Sida 1 Uppdaterad Programkonstruktion och datastrukturer Moment 9 Om högre ordningens funktioner PKD 2011/12 moment 9 Sida 1 Uppdaterad 2012-01-15 Anonyma funktioner igen En funktion som inte är namngiven kallas för en

Läs mer

Omtentamen (del 1, 6 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201)

Omtentamen (del 1, 6 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201) Omtentamen (del 1, 6 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201) Lars-Henrik Eriksson Fredag 5 april 2013, kl 14:00 17:00, i Polacksbackens skrivsal Hjälpmedel: Inga. Inte heller elektronisk

Läs mer

Programkonstruktion. Tentamen,

Programkonstruktion. Tentamen, Programkonstruktion (Programmeringsmetodik DV1) Tentamen, 2009-08-24 Lars-Henrik Eriksson Institutionen för informationsteknologi Uppsala Universitet Tid: 14:00-19:00. Börja med att läsa igenom alla frågorna

Läs mer

Programkonstruktion. Tentamen,

Programkonstruktion. Tentamen, Programkonstruktion (Programmeringsmetodik DV1) Tentamen, 2008-03-10 Lars-Henrik Eriksson Institutionen för informationsteknologi Uppsala Universitet Tid: 0900-14:00. Börja med att läsa igenom alla frågorna

Läs mer

Programkonstruktion och Datastrukturer

Programkonstruktion och Datastrukturer Programkonstruktion och Datastrukturer VT 2012 Tidskomplexitet Elias Castegren elias.castegren.7381@student.uu.se Problem och algoritmer Ett problem är en uppgift som ska lösas. Beräkna n! givet n>0 Räkna

Läs mer

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18 TDDC74 Programmering: Abstraktion och modellering Datortenta - 017-10-7, kl 14-18 Läs alla frågorna först och bestäm dig för i vilken ordning du vill lösa uppgifterna. Uppgifterna är inte nödvändigtvis

Läs mer

Programmeringsmetodik DV1, Programkonstruktion del 1 Tentamen,

Programmeringsmetodik DV1, Programkonstruktion del 1 Tentamen, Programmeringsmetodik DV1, Programkonstruktion del 1 Tentamen, 2007-08-21 Lars-Henrik Eriksson Institutionen för informationsteknologi Uppsala Universitet Tid: 0900-14:00. Börja med att läsa igenom alla

Läs mer

Två fall: q Tom sekvens: () q Sekvens av element: (a b c) ; (sum-rec '(2 4 6)) = 12. q Första elementet uppfyller vissa villkor: (2 a b c)

Två fall: q Tom sekvens: () q Sekvens av element: (a b c) ; (sum-rec '(2 4 6)) = 12. q Första elementet uppfyller vissa villkor: (2 a b c) Programmönster: # Listan som sekvens, Rekursiv process Enkel genomgång av sekvens (element på toppnivån i en lista)) TDDC60 Programmering: abstraktion och modellering Föreläsning 5 Rekursiva och iterativa

Läs mer

Programkonstruktion. Tentamen,

Programkonstruktion. Tentamen, Programkonstruktion (Programmeringsmetodik DV1) Tentamen, 2008-06-12 Lars-Henrik Eriksson Institutionen för informationsteknologi Uppsala Universitet Tid: 0900-14:00. Börja med att läsa igenom alla frågorna

Läs mer

Programkonstruktion och datastrukturer. Formell verifiering eller hur man bevisar att program gör rätt utan att testa dem

Programkonstruktion och datastrukturer. Formell verifiering eller hur man bevisar att program gör rätt utan att testa dem Programkonstruktion och datastrukturer Formell verifiering eller hur man bevisar att program gör rätt utan att testa dem PKD 2012/13 Formell verifiering Sida 1 Uppdaterad 2008-11-28 Formell verifiering:

Läs mer

Programmering II (ID1019) :00-17:00

Programmering II (ID1019) :00-17:00 ID1019 Johan Montelius Programmering II (ID1019) 2014-03-10 14:00-17:00 Förnamn: Efternamn: Instruktioner Du får inte ha något materiel med dig förutom skrivmateriel. Mobiler etc, skall lämnas till tentamensvakten.

Läs mer

Funktionell programmering DD1361

Funktionell programmering DD1361 Funktionell programmering DD1361 Tupler Två eller fler (men ändligt) antal element. Elementen kan vara av olika typer. Ex: (1,2) :: (Integer, Integer) (( 2, hejsan ), True) ::? Tupel med två element ->

Läs mer

Tentamen (del 2) (4 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201)

Tentamen (del 2) (4 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201) Tentamen (del 2) (4 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201) Lars-Henrik Eriksson Onsdag 20 mars 2013, kl. 08:00 11:00, i Bergsbrunnagatans skrivsal 1 Hjälpmedel: Inga. Inte heller

Läs mer

Rekursiva algoritmer sortering sökning mönstermatchning

Rekursiva algoritmer sortering sökning mönstermatchning Anders Haraldsson 1 Anders Haraldsson 2 Dagens föreläsning Programmering i Lisp Fö 6-7 Rekursiva strukturer rekursiva definitioner rekursiva funktioner rekursiva bevis: induktion - rekursion strukturell

Läs mer

Tentamen 1 (6 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201)

Tentamen 1 (6 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201) Tentamen 1 (6 högskolepoäng) i Programkonstruktion och datastrukturer (1DL201) Lars-Henrik Eriksson och Pierre Flener Fredag 17 december 2010, kl 14:00 17:00, i Gimogatan 4, sal 1 Hjälpmedel: Inga. Inte

Läs mer

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6 Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6? DAGENS AGENDA Komplexitet Ordobegreppet Komplexitetsklasser Loopar Datastrukturer Några nyttiga regler OBS! Idag jobbar

Läs mer

Föreläsning 4 Datastrukturer (DAT037)

Föreläsning 4 Datastrukturer (DAT037) Föreläsning 4 Datastrukturer (DAT07) Fredrik Lindblad 1 november 2017 1 Slides skapade av Nils Anders Danielsson har använts som utgångspunkt Se http://wwwcsechalmersse/edu/year/2015/course/dat07 1 Innehåll

Läs mer

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom:

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom: 6 Rekursion 6.1 Rekursionens fyra principer Problem löses genom: 1. förenkling med hjälp av "sig själv". 2. att varje rekursionssteg löser ett identiskt men mindre problem. 3. att det finns ett speciellt

Läs mer

Innehåll. Föreläsning 12. Binärt sökträd. Binära sökträd. Flervägs sökträd. Balanserade binära sökträd. Sökträd Sökning. Sökning och Sökträd

Innehåll. Föreläsning 12. Binärt sökträd. Binära sökträd. Flervägs sökträd. Balanserade binära sökträd. Sökträd Sökning. Sökning och Sökträd Innehåll Föreläsning 12 Sökträd Sökning Sökning och Sökträd 383 384 Binärt sökträd Används för sökning i linjära samlingar av dataobjekt, specifikt för att konstruera tabeller och lexikon. Organisation:

Läs mer

Former av rekursion. Programkonstruktion. Moment 5 Mera om rekursion. Fakultetsfunktionen. Största gemensamma delare (repris!

Former av rekursion. Programkonstruktion. Moment 5 Mera om rekursion. Fakultetsfunktionen. Största gemensamma delare (repris! Programkonstruktion Moment 5 Mera om rekursion Former av rekursion enkel rekursion ett rekursivt anrop. fullständig rekursion argumenten (varianten) kan mska olika många steg i det rekursiva anropet. multipel

Läs mer

Programmering II (ID1019) :00-11:00

Programmering II (ID1019) :00-11:00 ID1019 Johan Montelius Programmering II (ID1019) 2015-06-11 08:00-11:00 Instruktioner Du får inte ha något materiel med dig förutom skrivmateriel. Mobiler etc, skall lämnas till tentamensvakten. Svaren

Läs mer

Programkonstruktion och. Datastrukturer

Programkonstruktion och. Datastrukturer Programkonstruktion och Datastrukturer Repetitionskurs, sommaren 2011 Datastrukturer (Listor, Träd, Sökträd och AVL-träd) Elias Castegren elias.castegren.7381@student.uu.se Datastrukturer Vad är en datastruktur?

Läs mer

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 27 augusti 2016, kl 8 12

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 27 augusti 2016, kl 8 12 TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 27 augusti 2016, kl 8 12 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.

Läs mer

Föreläsning 5 Datastrukturer (DAT037)

Föreläsning 5 Datastrukturer (DAT037) Föreläsning 5 Datastrukturer (DAT037) Nils Anders Danielsson, Fredrik Lindblad 2016-11-14 Förra gången: Cirkulära arrayer Prioritetskö Binära heapar Leftistheapar merge Det verkar inte gå att slå ihop

Läs mer

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 9 juni 2016, kl 14 18

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 9 juni 2016, kl 14 18 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.

Läs mer

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad 1 Datatyper Tobias Wrigstad Det finns flera olika typer av (slags) data Olika datatyper har olika egenskaper. T.ex. är ett personnummer inte ett tal. (Den sista siffran skall stämma enligt den s.k. Luhnalgoritmen

Läs mer

Språket Python - Del 1 Grundkurs i programmering med Python

Språket Python - Del 1 Grundkurs i programmering med Python Hösten 2009 Dagens lektion Ett programmeringsspråks byggstenar Några inbyggda datatyper Styra instruktionsflödet Modulen sys 2 Ett programmeringsspråks byggstenar 3 ETT PROGRAMMERINGSSPRÅKS BYGGSTENAR

Läs mer

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python Hjälpmedel Följande hjälpmedel är tillåtna: Exakt en valfri bok, t.ex. den rekommenderade kursboken. Boken får ha anteckningar,

Läs mer

Programkonstruktion. Moment 11 Om sidoeffekter In/utmatning och imperativ programmering. PKD 2011/12 moment 11 Sida 1 Uppdaterad

Programkonstruktion. Moment 11 Om sidoeffekter In/utmatning och imperativ programmering. PKD 2011/12 moment 11 Sida 1 Uppdaterad Programkonstruktion Moment 11 Om sidoeffekter In/utmatning och imperativ programmering PKD 2011/12 moment 11 Sida 1 Uppdaterad 2012-01-30 Referentiell transparens I ren funktionell programmering kan man

Läs mer

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson 2

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson 2 Anders Haraldsson 1 Anders Haraldsson 2 Dagens föreläsning Programmering i Lisp Fö 5 - Funktioner - lambda-uttryck (avs 7.1) - funcall och function (avs 7.2) - Högre ordningens funktioner (avs 7.) - Iteratorer

Läs mer

Föreläsning 9 Datastrukturer (DAT037)

Föreläsning 9 Datastrukturer (DAT037) Föreläsning Datastrukturer (DAT07) Fredrik Lindblad 27 november 207 Slides skapade av Nils Anders Danielsson har använts som utgångspunkt Se http://wwwcsechalmersse/edu/year/20/course/dat07 Innehåll 2

Läs mer

Övningsuppgifter #11, Programkonstruktion och datastrukturer

Övningsuppgifter #11, Programkonstruktion och datastrukturer Övningsuppgifter #11, Programkonstruktion och datastrukturer Lösningsförslag Elias Castegren elias.castegren@it.uu.se Övningar 1. 1 2. 2 3. Ett binomialträd med rang n har 2 n noder. En binomial heap innehåller

Läs mer

Dagens föreläsning Programmering i Lisp Fö 5

Dagens föreläsning Programmering i Lisp Fö 5 Anders Haraldsson 1 Dagens föreläsning Programmering i Lisp Fö 5 - Funktioner - lambda-uttryck (avs 7.1) - funcall och function (avs 7.2) - Högre ordningens funktioner (avs 7.3) - Iteratorer - Egenskaper

Läs mer

Föreläsning 6: Introduktion av listor

Föreläsning 6: Introduktion av listor Föreläsning 6: Introduktion av listor Med hjälp av pekare kan man bygga upp datastrukturer på olika sätt. Bland annat kan man bygga upp listor bestående av någon typ av data. Begreppet lista bör förklaras.

Läs mer

DD1361 Programmeringsparadigm. Carina Edlund

DD1361 Programmeringsparadigm. Carina Edlund DD1361 Programmeringsparadigm Carina Edlund carina@nada.kth.se Funktionell programmering Grundidéen med funktionell programmering är att härma matematiken och dess funktionsbegrepp. Matematiskt funktionsbegrepp

Läs mer

Lösningsförslag för tentamen i Datastrukturer (DAT036) från

Lösningsförslag för tentamen i Datastrukturer (DAT036) från Lösningsförslag för tentamen i Datastrukturer (DAT036) från 2011-12-16 Nils Anders Danielsson 1. Låt oss benämna indatalistan strängar. Vi kan börja med att beräkna varje strängs frekvens genom att använda

Läs mer

Imperativ programmering. Imperativ programmering konstruktioner i Lisp. Datastrukturer (kap ) arraystruktur poststruktur

Imperativ programmering. Imperativ programmering konstruktioner i Lisp. Datastrukturer (kap ) arraystruktur poststruktur Imperativ programmering konstruktioner i Lisp Imperativ programmering I den imperativa programmeringen skriver vi program satsvist. Datastrukturer (kap.-.) aystruktur poststruktur Iterativa uttryck (avs.)

Läs mer

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

TDDI16 Datastrukturer och algoritmer. Algoritmanalys TDDI16 Datastrukturer och algoritmer Algoritmanalys 2017-08-28 2 Översikt Skäl för att analysera algoritmer Olika fall att tänka på Medelfall Bästa Värsta Metoder för analys 2017-08-28 3 Skäl till att

Läs mer

Tentamen, Algoritmer och datastrukturer

Tentamen, Algoritmer och datastrukturer UNDS TEKNISKA ÖGSKOA (6) Institutionen för datavetenskap Tentamen, Algoritmer och datastrukturer 23 8 29, 8. 3. Anvisningar: Denna tentamen består av fem uppgifter. Totalt är skrivningen på 36 poäng och

Läs mer

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 2 Introduktion till funktioner och programutveckling

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 2 Introduktion till funktioner och programutveckling Programmeringsmetodik DV1 Programkonstruktion 1 Moment 2 Introduktion till funktioner och programutveckling PK1&PM1 HT-06 moment 2 Sida 1 Uppdaterad 2005-09-20 Återanvändning av kod? String.substring("Hägg",size

Läs mer

Tentamen Datastrukturer (DAT036/DAT037/DIT960)

Tentamen Datastrukturer (DAT036/DAT037/DIT960) Tentamen Datastrukturer (DAT036/DAT037/DIT960) Datum och tid för tentamen: 2016-04-07, 14:00 18:00. Författare: Nils Anders Danielsson. (Tack till Per Hallgren och Nick Smallbone för feedback.) Ansvarig:

Läs mer

Idag: Dataabstraktion

Idag: Dataabstraktion Idag: Dataabstraktion Hur använder vi det vi hittills kan om Scheme för att realisera (implementera) sammansatta data? DA2001 (Föreläsning 7) Datalogi 1 Hösten 2013 1 / 16 Idag: Dataabstraktion Hur använder

Läs mer

Föreläsning Datastrukturer (DAT037)

Föreläsning Datastrukturer (DAT037) Föreläsning Datastrukturer (DAT037) Nils Anders Danielsson 2015-11-23 Idag Mer om grafer: Minsta uppspännande träd (för oriktade grafer). Djupet först-sökning. Minsta uppspännande träd Träd (utan rot)

Läs mer

Programmering II (ID1019)

Programmering II (ID1019) ID1019 Johan Montelius Instruktioner Betyg Programmering II (ID1019) 2019-03-08 Svaren skall lämnas på dessa sidor, använd det utrymme som nns under varje uppgift för att skriva ner ditt svar (inte på

Läs mer

Produktionsplanering. Programkonstruktion. Ett programutvecklingsexempel. Programutvecklingsprocessen. Exempel produktregister. 2.

Produktionsplanering. Programkonstruktion. Ett programutvecklingsexempel. Programutvecklingsprocessen. Exempel produktregister. 2. Programkonstruktion Ett programutvecklingsexempel Produktionsplanering Vid produktionsplanering i en fabrik använder man komponentlistor för att beskriva materialet som behövs för att tillverka en produkt.

Läs mer

GOTO och lägen. Några saker till och lite om snabbare sortering. GOTO och lägen (3) GOTO och lägen (2)

GOTO och lägen. Några saker till och lite om snabbare sortering. GOTO och lägen (3) GOTO och lägen (2) Några saker till och lite om snabbare sortering GOTO och lägen GOTO hemskt eller ett måste? CASE enkla val över diskreta värdemängder Snabb sortering principer Snabb sortering i Scheme och Pascal QuickSort

Läs mer

Repetition i Python 3. Exemplen fac. Exemplen fac motivering. Exemplen fac i Python

Repetition i Python 3. Exemplen fac. Exemplen fac motivering. Exemplen fac i Python Repetition i Python 3 Exemplen fac Orginalet I Scheme använde vi rekursion för all slags repetition. Efterom Scheme är ett funktionellt språk återsänder alla språkkonstruktioner ett värde men i Python

Läs mer

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel Data- och Programstrukturer Provmoment: Ladokkod: Tentamen ges för: Omtentamen NDP011 Systemarkitektprogrammet 7,5 högskolepoäng Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum:

Läs mer

Några saker till och lite om snabbare sortering

Några saker till och lite om snabbare sortering Några saker till och lite om snabbare sortering GOTO hemskt eller ett måste? CASE enkla val över diskreta värdemängder Snabb sortering principer Snabb sortering i Scheme och Pascal QuickSort (dela städat

Läs mer

GRUNDER I VHDL. Innehåll. Komponentmodell Kodmodell Entity Architecture Identifierare och objekt Operationer för jämförelse

GRUNDER I VHDL. Innehåll. Komponentmodell Kodmodell Entity Architecture Identifierare och objekt Operationer för jämförelse GRUNDER I VHDL Innehåll Komponentmodell Kodmodell Entity Architecture Identifierare och objekt Operationer för jämförelse KOMPONENTMODELL Modell för att beskriva komponenter Externt interface Intern funktion

Läs mer

FÖRELÄSNING 2, TDDC74, VT2018 BEGREPP PROBLEMLÖSNING MED HJÄLP AV FALLANALYS PROBLEMLÖSNING MED HJÄLP AV REKURSION

FÖRELÄSNING 2, TDDC74, VT2018 BEGREPP PROBLEMLÖSNING MED HJÄLP AV FALLANALYS PROBLEMLÖSNING MED HJÄLP AV REKURSION FÖRELÄSNING 2, TDDC74, VT2018 Begrepp och definitioner (delvis från föreläsning 1) Fallanalys som problemlösningsmetod Rekursivt fallanalys Rekursiva beskrivningar och processer de kan skapa Rekursiva

Läs mer

Tentamen i. TDDC67 Funktionell programmering och Lisp

Tentamen i. TDDC67 Funktionell programmering och Lisp 1 Linköpings tekniska högskola Institutionen för datavetenskap Anders Haraldsson Tentamen i TDDC67 Funktionell programmering och Lisp och äldre kurser TDDC57 Programmering, Lisp och funktionell programmering

Läs mer

DD1320 Tillämpad datalogi. Lösning (skiss) till tenta 20 okt 2011

DD1320 Tillämpad datalogi. Lösning (skiss) till tenta 20 okt 2011 DD1320 Tillämpad datalogi Lösning (skiss) till tenta 20 okt 2011 1 KMP P I P P I N i 1 2 3 4 5 6 Next[i] 0 1 0 2 1 3 2 Huffmankodning: Algoritmen 1. Sortera tecknen som ska kodas i stigande förekomstordning.

Läs mer

Datastrukturer. föreläsning 10. Maps 1

Datastrukturer. föreläsning 10. Maps 1 Datastrukturer föreläsning 10 Maps 1 Minsta uppspännande träd Maps 2 Minsta uppspännande träd Uppspännande träd till graf fritt delträd innehåller alla noderna Minsta uppspännande träd (MST) är det uppspännande

Läs mer

Programmering II (ID1019) :00-11:00

Programmering II (ID1019) :00-11:00 ID1019 Johan Montelius Programmering II (ID1019) 2015-06-11 08:00-11:00 Instruktioner Du får inte ha något materiel med dig förutom skrivmateriel. Mobiler etc, skall lämnas till tentamensvakten. Svaren

Läs mer

Tillämpad Programmering (ID1218) :00-13:00

Tillämpad Programmering (ID1218) :00-13:00 ID1218 Johan Montelius Tillämpad Programmering (ID1218) 2014-03-13 09:00-13:00 Förnamn: Efternamn: Regler Du får inte ha något materiel med dig förutom skrivmateriel. Mobiler etc, skall lämnas till tentamensvakten.

Läs mer

Lösningar Datastrukturer TDA

Lösningar Datastrukturer TDA Lösningar Datastrukturer TDA416 2016 12 21 roblem 1. roblem 2. a) Falskt. Urvalssortering gör alltid samma mängd av jobb. b) Sant. Genom att ha en referens till sista och första elementet, kan man nå både

Läs mer

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18 TDDC74 Programmering: Abstraktion och modellering Datortenta - 2018-06-07, kl 14-18 Läs alla frågorna först och bestäm dig för i vilken ordning du vill lösa uppgifterna. Uppgifterna är inte nödvändigtvis

Läs mer

Träd, binära träd och sökträd. Koffman & Wolfgang kapitel 6, avsnitt 1 4

Träd, binära träd och sökträd. Koffman & Wolfgang kapitel 6, avsnitt 1 4 Träd, binära träd och sökträd Koffman & Wolfgang kapitel 6, avsnitt 1 4 1 Träd Träd är ickelinjära och hierarkiska: i motsats till listor och fält en trädnod kan ha flera efterföljare ( barn ) men bara

Läs mer

Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två

Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två Binära träd Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två gånger, talar man om binära träd. Sådana

Läs mer

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python TDDE24 Funktionell och imperativ programmering del 2

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python TDDE24 Funktionell och imperativ programmering del 2 Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python TDDE24 Funktionell och imperativ programmering del 2 Hjälpmedel Följande hjälpmedel är tillåtna: Exakt en valfri bok,

Läs mer

Datastrukturer och algoritmer. Innehåll. Tabell. Tabell - exempel. Gränsyta till Tabell. Tabell. Modell. Hashtabell Relation, lexikon.

Datastrukturer och algoritmer. Innehåll. Tabell. Tabell - exempel. Gränsyta till Tabell. Tabell. Modell. Hashtabell Relation, lexikon. Datastrukturer och algoritmer Föreläsning 7 Tabell, hashtabell Relation & lexikon Innehåll Tabell Tabell Hashtabell Relation, lexikon Modell Uppslagsbok Organisation Ändlig avbildning av argument på värden

Läs mer

SCB :-0. Uno Holmer, Chalmers, höger 2 Ex. Induktiv definition av lista. // Basfall

SCB :-0. Uno Holmer, Chalmers, höger 2 Ex. Induktiv definition av lista. // Basfall Rekursiva funktioner Föreläsning 10 (Weiss kap. 7) Induktion och rekursion Rekursiva funktioner och processer Weiss 7.1-3 (7.4, 7.5.3 utgår) Fibonaccital (7.3.4) Exempel: Balansering av mobil (kod se lab

Läs mer

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande: Föreläsning 7 Innehåll Rekursion Rekursivt tänkande: Hur många år fyller du? Ett år mer än förra året! Rekursion Rekursiv problemlösning Binärsökning Generiska metoder Rekursiv problemlösning: Dela upp

Läs mer

F11 - Rekursion. ID1004 Objektorienterad programmering Fredrik Kilander

F11 - Rekursion. ID1004 Objektorienterad programmering Fredrik Kilander F11 - Rekursion ID1004 Objektorienterad programmering Fredrik Kilander fki@kth.se Rekursion Rekursion är en programmeringsteknik En metod anropar sig själv public String reverse (String s) { if (s.length()

Läs mer

Föreläsning Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT036) Föreläsning Datastrukturer (DAT036) Nils Anders Danielsson 2013-11-18 Idag Mer om grafer: Minsta uppspännande träd (för oriktade grafer). Prims algoritm. Kruskals algoritm. Djupet först-sökning. Cykel

Läs mer

Dugga Datastrukturer (DAT036)

Dugga Datastrukturer (DAT036) Dugga Datastrukturer (DAT036) Duggans datum: 2012-11-21. Författare: Nils Anders Danielsson. För att en uppgift ska räknas som löst så måste en i princip helt korrekt lösning lämnas in. Enstaka mindre

Läs mer

Föreläsning 7. Träd och binära sökträd

Föreläsning 7. Träd och binära sökträd Föreläsning 7 Träd och binära sökträd Föreläsning 7 Träd Binära träd Binärt sökträd som ADT Implementering av binärt sökträd Travestera binärt sökträd Sökning Insättning/borttagning Läsanvisningar och

Läs mer

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python Hjälpmedel Följande hjälpmedel är tillåtna: Exakt en valfri bok, t.ex. den rekommenderade kursboken. Boken får ha anteckningar,

Läs mer

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X

BINÄRA TRÄD. (X = pekarvärdet NULL): struct int_bt_node *pivot, *ny; X X X 12 X X 12 X X -3 X X Algoritmer och Datastrukturer Kary FRÄMLING/Göran PULKKIS (v23) Kap. 7, Sid 1 BINÄRA TRÄD Träd används för att representera olika slags hierarkier som ordnats på något sätt. Den mest använda trädstrukturen

Läs mer

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) Snabba frågor Alla svar motiveras väl. Facit Tentamen TDDC30 2015-08-28 kl 08-12 1 (6) Teoretisk del 1. (6p) "Snabba frågor" Alla svar motiveras väl. a) Vad är syftet med ett interface? (1p) Svar:Att ange vilka metoder som ska finnas, utan

Läs mer

Programkonstruktion och datastrukturer. Moment 3 Rekursion och listor. PKD 2012/13 moment 3 Sida 1 Uppdaterad

Programkonstruktion och datastrukturer. Moment 3 Rekursion och listor. PKD 2012/13 moment 3 Sida 1 Uppdaterad Programkonstruktion och datastrukturer Moment 3 Rekursion och listor PKD 2012/13 moment 3 Sida 1 Uppdaterad 2012-11-04 Summera godtyckligt antal tal sumupto n skall beräkna summan av talen från 0 till

Läs mer

Föreläsning Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT036) Föreläsning Datastrukturer (DAT036) Nils Anders Danielsson 2013-11-25 Idag Starkt sammanhängande komponenter Duggaresultat Sökträd Starkt sammanhängande komponenter Uppspännande skog Graf, och en möjlig

Läs mer

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga. Tentamen Programmeringsteknik II 2015-05-26 Skrivtid: 0800 1300 Tänk på följande Skriv läsligt! Använd inte rödpenna! Skriv bara på framsidan av varje papper. Börja alltid ny uppgift på nytt papper. Lägg

Läs mer

Föreläsning 7. Träd och binära sökträd

Föreläsning 7. Träd och binära sökträd Föreläsning 7 Träd och binära sökträd Föreläsning 7 Träd Binära träd Binärt sökträd som ADT Implementering av binärt sökträd Travestera binärt sökträd Sökning Insättning/borttagning Det är extra mycket

Läs mer

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd Föreläsning 8 Innehåll Datastrukturer i kursen Träd, speciellt binära träd egenskaper användningsområden implementering Undervisningsmoment: föreläsning 8, övningsuppgifter 8, lab 4 Avsnitt i läroboken:

Läs mer

Tillämpad programmering

Tillämpad programmering Tillämpad programmering Erlang II Johan Montelius 1 Datastrukturer literaler atomer: foo, gurka, 'ett o två' nummer: 1,2,.. 3.14... samansatta (compound) tupler: {foo, a, b, 2} cons-cell: [gurka tomat

Läs mer

Föreläsning 9 Innehåll

Föreläsning 9 Innehåll Föreläsning 9 Innehåll Binära sökträd algoritmer för sökning, insättning och borttagning, implementering effektivitet balanserade binära sökträd, AVL-träd Abstrakta datatyperna mängd (eng. Set) och lexikon

Läs mer

Programkonstruktion och. Datastrukturer

Programkonstruktion och. Datastrukturer Programkonstruktion och Datastrukturer Repetitionskurs, sommaren 2011 Datastrukturer (hash-tabeller och heapar) Elias Castegren elias.castegren.7381@student.uu.se Arrayer igen En array är en linjär datastruktur

Läs mer

Programmering II (ID1019) :00-12:00

Programmering II (ID1019) :00-12:00 ID1019 Johan Montelius Programmering II (ID1019) 2014-01-16 09:00-12:00 Förnamn: Efternamn: Instruktioner Du får inte ha något materiel med dig förutom skrivmateriel. Mobiler etc, skall lämnas till tentamensvakten.

Läs mer

Grundläggande datalogi - Övning 4

Grundläggande datalogi - Övning 4 Grundläggande datalogi - Övning 4 Björn Terelius November 21, 2008 Definitioner Olika mått på komplexitet Definition En funktion f sägs vara O(g) om det existerar konstanter c, N så att f (n) < cg(n) för

Läs mer

Återanvändning av kod? Programkonstruktion. Moment 2 Introduktion till funktioner och programutveckling. Funktionsdefinitioner. Egna funktioner i ML

Återanvändning av kod? Programkonstruktion. Moment 2 Introduktion till funktioner och programutveckling. Funktionsdefinitioner. Egna funktioner i ML Programkonstruktion Moment 2 Introduktion till funktioner och programutveckling Återanvändning av kod? String.substring("Hägg",size "Hägg"-3,3) > "ägg" Detta uttryck plockar ut ett visst antal tecken (3)

Läs mer

TDDC74 Programmering, abstraktion och modellering. Tentamen

TDDC74 Programmering, abstraktion och modellering. Tentamen AID-nummer: Datum: 2011-01-11 1 Tekniska högskolan vid Linköpings universitet Institutionen för datavetenskap Anders Haraldsson TDDC74 Programmering, abstraktion och modellering Tentamen Tisdag 11 januari

Läs mer

TDIU01 - Programmering i C++, grundkurs

TDIU01 - Programmering i C++, grundkurs TDIU01 - Programmering i C++, grundkurs Sammanfattning period 1 Eric Elfving Institutionen för datavetenskap 1 oktober 2013 Översikt Ett C++-programs uppbyggnad Variabler Datatyper Satser Uttryck Funktioner

Läs mer

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor

Abstrakta datatyper. Primitiva vektorer. Deklarera en vektor Abstrakta datatyper 1 Primitiva vektorer Vektorer kan skapas av primitiva datatyper, objektreferenser eller andra vektorer. Vektorer indexeras liksom i C från 0. För att referera en vektor används hakparenteser.

Läs mer

Omgivningar. Omgivningar är viktiga eftersom de avgör vilka namn som är synliga och därmed dessas innebörd och de värden som är förknippade med dem.

Omgivningar. Omgivningar är viktiga eftersom de avgör vilka namn som är synliga och därmed dessas innebörd och de värden som är förknippade med dem. Omgivningar Omgivningar är viktiga eftersom de avgör vilka namn som är synliga och därmed dessas innebörd och de värden som är förknippade med dem. (define (sqrroot c) (define (fixpoint guess c eps) (define

Läs mer

Programmering II (ID1019) :00-12:00

Programmering II (ID1019) :00-12:00 ID1019 Johan Montelius Programmering II (ID1019) 2015-03-13 09:00-12:00 Instruktioner Du får inte ha något materiel med dig förutom skrivmateriel. Mobiler etc, skall lämnas till tentamensvakten. Svaren

Läs mer

Innehåll. F7: Tabell, hashtabell, relation & lexikon. Gränsyta till Tabell. Tabell. Tabell Hashtabell Relation Lexikon.

Innehåll. F7: Tabell, hashtabell, relation & lexikon. Gränsyta till Tabell. Tabell. Tabell Hashtabell Relation Lexikon. Innehåll F7: Tabell, hashtabell, relation & lexikon Niclas Börlin 5DV49 Datastrukturer och algoritmer Tabell Hashtabell Relation Lexikon Tabell Gränsyta till Tabell Modell Uppslagsbok Organisation Ändlig

Läs mer

Procedurer och villkor

Procedurer och villkor Procedurer och villkor (define lessorequal (lambda (x y) (or (< x y) (= x y)))) (define between (lambda (x y z) (and (lessorequal x y) (lessorequal y z)))) > (between 3 4 5) #t > (between 3 2 5) #f DA2001

Läs mer

Tentamen Datastrukturer (DAT036)

Tentamen Datastrukturer (DAT036) Tentamen Datastrukturer (DAT036) Datum och tid för tentamen: 2013-12-16, 14:00 18:00. Ansvarig: Nils Anders Danielsson. Nås på 0700 620 602 eller anknytning 1680. Besöker tentamenssalarna ca 15:00 och

Läs mer

Föreläsning 8 Datastrukturer (DAT037)

Föreläsning 8 Datastrukturer (DAT037) Föreläsning 8 Datastrukturer (DAT037) Fredrik Lindblad 1 2016-11-23 1 Slides skapade av Nils Anders Danielsson har använts som utgångspunkt. Se http://www.cse.chalmers.se/edu/year/2015/course/dat037 Förra

Läs mer