Symbolske data SICP 2.3

Størrelse: px
Begynne med side:

Download "Symbolske data SICP 2.3"

Transkript

1 Symbolske data SICP 2.3 Vi har så langt alt vesentlig sett på tall enkeltstående tall, talluttrykk, og lister og trær med tall. Et av målene for John McCarthy (opphavsmannen til Lisp) var å lage et språk for manipulering av symboler slik man f.eks. gjør i matematikken (algebra) ved behandling av ligninger med én eller flere ukjente. Ett program kan være data til et annet (f.eks. er kildekoden data til kompilatoren). Med symboler kan vi anskueliggjøre dette innenfor ett og samme program. Men har vi et språk for symbolmanipulering, trenger vi selvsagt ikke begrense oss til matematikken. Vi kan også regne på begrepsmessige relasjoner mellom mer eller mindre kompliserte objekter personer, naturlige språk, etc.. 257

2 For å kunne operere på symboler, trenger vi en symbolsyntaks. En ting er de navngitte objekter vi har i og med programmets prosedyrer og variabler, men for skikkelig symbolbehandling ønsker vi også variabel-variabler, dvs. Scheme-variabler med variabelsymboler som verdier Så å si alle høynivåspråk, herunder Scheme, har typer for enkelttegn og tegnstrenger, men disse er ikke særlig godt egnet for å etablere det metabegrepet vi ønsker oss. Scheme har derfor, i tillegg til talltypene, typene tegn og boolean og de sammensatte typene par, liste, vektor og streng, en egen type symbol. Selv om Scheme er løst (dynamisk) typet er typekontrollen strikt der det er relevant. F.eks. kan sammenligningsprosedyrene <, <=, =, >=, og > bare brukes på tall. Men, som vi skal se, finnes det ekvivalensprosedyrer som tillater argumenter av ulike typer, selv om en sammenligning på tvers av typer alltid vil gi resultatet false. 258

3 (For leselighetens skyld skriver jeg true og false i stedet for #t og #f.) (symbol? 'foo) => true (symbol? (car '(a b))) => true (symbol? "bar") => false (symbol? #t) => false (symbol? '()) => false (define nil '()) (symbol? nil) => false (symbol? 'nil) => true (define nil 'nil) (symbol? nil) => true ; her har vi en tegnstreng ; her har vi en boolesk verdi ikke et symbol ; den tomme listen er ikke et symbol ; nil er en Scheme-variabel, bundet til den tomme listen. ; men dette er symbolet ikke den tomme listen ; nil er nå en Scheme-variabel bundet til symbolet nil. Symboler kan opptre helt og holdent på linje med tall, strenger og objekter av andre typer, men de kan også opptre som eller representere variabler. Dvs. på det syntaktiske nivået er de stadig objekter, men på det symbolbehandlende metanivået er de variabler. 259

4 Symboler er kjennetegnet ved at to symboler er identiske dersom de staves likt. Et symbol opptrer i sitert quote'et form. quote er en spesialform som bl.a. brukes for å innføre symboler. 'sym, og dermed (quote sym), evaluerer til sym. 'sym er syntaktisk sukker for (quote sym) REPL skriver ut den forenklede varianten, slik at f.eks.(quote (quote sym)) skrives 'sym. Bruken av én enkelt prefisket apostrof er entydig, fordi etterfølgende whitespace eller sluttparentes skiller det aktuelle symbolet fra etterfølgende språklige elementer. quote kan også brukes for lister. '(1 2 3)) (list 1 2 3)) '(a b c)) (list 'a 'b 'c)) Alle slags Scheme-uttrykk prosedyrekall, bruk av spesialformer, definisjoner, etc. kan quotes, og alle quotede uttrykk kan evalueres vha. prosedyren eval, slik at for eksempel (eval '(+ 2 3)) og ((eval '+) 2 3)begge evaluerer til 5, men hvis resultatet av eval ikke gir mening, går det galt, f.eks. slikt at (eval 'a) ville gi kjøreavbrudd, dersom ikke a alt var definert. Noen få tegn kan ikke quotes direkte: #., ' " ` \ ( ) [ ] { } hash, punktum, komma, enkel og dobbel apostrof, backquote, backslash, pipe og parentesene (og muligens noen til), men de kan quotes sammen med escapetegnet \. I Racket skrives slike symboler ut omgitt av pipes. Eks '\# skrives #. 260

5 Sammenligningsprosedyrer for ulike typer objekter tall - tall, strenger - strenger, symboler - symboler, etc. I forbindelsen med tallbehandling har vi brukt sammenligningsprosedyrene for likhet og størrelsesrelasjoner: =, <, >, <= og >=. I Scheme virker disse, som nevnt, bare for tall, og vi har andre sammenligningsoperatorer for objekter av andre typer; og vi kan også innlemme egne sammenligningsoperator i abstraksjonsabrrieren for en egendefinert type. I mange språk er disse overlesset slik at de også virker for strenger og C++ tillater ytterligere skreddersydd (custom) overlessing for egendefinerte typer. Det finnes imidlertid også generelle ekvivalenspredikater, bl.a eq? gjelder objekters identitet (referanse / adresse / lokasjon (plass i memory)) equal? gjelder numerisk, boolesk, tegnmessige eller symbolmessige likhet, eller sammensatte objekter, mht. deres innhold, element for element. Det finnes også et ekvivalenspredikatet eqv? som gjelder gjelder objekters identitet og eventuell numeriske, booleske, tegnmessige eller symbolmessige likhet. Vi klarer oss imidlertid lenge med eq? og equal? 261

6 To distinkte objekter kan ha samme innhold. (define symbolpar-1 '(sym bol)) (define symbolpar-2 '(sym bol)) (eq? symbolpar-1 symbolpar-2) false (samme innhold ulike objekter) (equal? symbolpar-1 symbolpar-2) true (samme innhold) (define symbol-1 'sym) (define symbol-2 'sym) (eq? symbol-1 symbol-2) true (symboler som staves likt, er identiske) (equal? symbol-1 symbol-2) true " (eq? symbol-1 (car symbolpar-2)) true " (= symbol-1 symbol-2) feilmelding: = expects type <number>... (eq? 2 2) true (fra Racket ellers, i hht R 5 RS, uspesifisert) (equal? 2 2) true Idéelt skal det, for av såvel tall som symboler, være slik at hvis ulike forekomster har samme verdi så er de også samme objekt(cfr. Platon), og slik er det også i Racket. 262

7 Symbolsk differensiering (derivasjon) SICP 2.3. Differensiering i matematikken går ut på å finne funksjoners endringsrater eller deriverte (avledede). F.eks. har funksjonen f(x) = 3x endringsraten 3, dvs. for hver endring av x endres funskjonsverdien med 3. For f(x) = 3x er dette en grei beskrivelse ettersom f er linær. For ikke-lineære funksjoner som f.eks. x 2, trenger vi en mer raffinert beskrivelse. Vi sier at den deriverte av en funksjon f(x) er grenseverdien for uttrykket (i) f(x + h) f(x) h når h (på en eller annen måte) går mot 0. Eller sagt på en annen måte Merk at f(x + 0) f(x), altså 0, ikke gir 0 0 mening (ii) f ' (x) = lim f(x + h) f(x) h 0 h Eller på nok en måte, når vi sier at det til en endring x av x svarer en endring y av y. dy y (iii) f ' (x) = = lim dx x 0 x NB! Uttrykket dx/dy angir ikke en brøk, men kun et symbol for den deriverte som altså er en grenseverdi. Her er det viktig å holde ting fra hverandre. 263

8 Bl.a. følgende regler gjelder for derivasjon: (1) c' = 0 den deriverte av en konstant = 0 (2) x' = 1 den deriverte av identitetsfunksjonen = 1 (3) (f(x) + g(x))' = f '(x) + g'(x) den deriverte av summen av to funksjoner = summen av de deriverte av de to funksjonene (4) (f(x) g(x))' = f '(x) g(x) + g'(x) f(x) den deriverte av produktet av to funksjoner = summen av den deriverte av den første ganger den andre og den deriverte av den andre ganger den første f(x) (f '(x) g(x) g'(x) f(x)) den deriverte av brøken av to funksjoner = differansen mellom (5) ( )' = den deriverte av telleren ganger nevneren og g(x) (g(x)) 2 den deriverte av nevneren ganger telleren, delt på kvadratet av nevneren (6) (f(g(x)))' = f '(g(x)) g'(x) den deriverte av en sammensatt funksjon = den deriverte av den ytterte mht. den innerste ganger den deriverte av den innerste Ved gjentatt anvendelse av (4) kan vi avlede (7) (x n )' = n x n-1 f.eks. den deriverte av x 3 = 3x 2 fordi (x x x)' = ((x x) x)' = (x x)' x + (x x) x' = (x' x + x x')x + x x 1 = (1 x + x 1) x + x x 1 = x x + x x + x x = 3 x x. Her har jeg brukt f ' for den dervierte av f. For å unngå forvekslingen med formen quote, bruker jeg heretter formen dy/dx den deriverte av y mht. x. 264

9 Differensiering i Scheme Vi tar for oss et utvalg av disse reglene, når vi nå går løs på symbolsk differensiering i Scheme, i første omgang (1) (4) som i SICP er notert slik * : dc (1) = 0 dx dx (2) = 1 dx d(u + v) du dv (3) = + dx dx dx (4) d(u v) dv du = u + v dx dx dx NB! Selv om dette ser ut som (og forsåvidt er) matematikk, er det for oss primært symbolmanipulering etter bestemt regler. Finner vi et uttrykk med formen til venstresiden i for eksempel (3), skal vi lage et uttrykk som det som står på høyresiden i (3). * Det finnes flere notasjoner for den deriverte med ulike opphavsmenn (ingen kvinner) først og fremst Euler, Newton, Leibniz og Lagrange. 265

10 Her er noen eksempler på det vi ønsker å få til, når vi deriverer med hensyn på x: d(x + 3) d(3x) d(x y) d((xy)(3x)) 1, 3, y, 6xy dx dx dx dx Vi velger imidlertid i første omgang prefiks- fremfor infiks-notasjon, siden prefiks er lettere å arbeide med i Scheme. Og i tillegg til det uttrykket som skal deriveres, lar vi symbolet for den variabelen det skal deriveres med hensyn på, være argument til deriveringsprosedyren Vi vil altså ha en funksjon som virker slik: (deriv '(+ x 3) 'x) 1 ; den deriverte av (+ x 3) mht. x = 1 (deriv '(* x 3) 'x) 3 (deriv '(* x y) 'x) y 3x xy (deriv '(* (* x y) (* x 3)) 'x) xy + 3x = 6xy dx dx Det skal imidlertid vise seg at vi må arbeide en del, før vi kan få til resultater som disse. 266

11 Første utgaven av deriveringsprosedyren ser slik ut. (define (deriv exp var) ; derivér uttrykket exp med hensyn til variabelen var. (cond ((number? exp) 0) ; regel (1): konstant ((variable? exp) ; regel (1) el. (2): konstant eller hensynsvariabel (if (same-variable? exp var) 1 ; regel (2): hensynsvariabel 0)) ; regel (1): konstant ((sum? exp) ; regel (3): sum (make-sum (deriv (addend exp) var) ; rekursér for å derivere addenden (deriv (augend exp) var))) ; rekursér for å derivere augenden ((product? exp) ; regel (4): produkt (make-sum (make-product (multiplier exp) (deriv (multiplicand exp) var)); rekursér for å deriv. multiplikand (make-product (deriv (multiplier exp) var) ; rekursér for å deriv. multiplikator (multiplicand exp)))) (else (error "unknown expression type DERIV" exp)))) 267

12 Over har vi brukt predikater og selektorer vi ennå ikke har definert. Hvordan disse skal defineres, beror på hvordan vi velger å representere de (algebraiske) uttrykkene som skal deriveres. Ved hjelp av lister, og med prefiks-notasjon, får vi følgende implementasjon: Tall er tall (define (number? x) (number? x)) ; number? er en Scheme-primitive Variabler er symboler (define (variable? x) (symbol? x)) ; symbol? er en Scheme-primitive Vi trenger en sammenligningsprosedyre for å kunne kjenne igjen den variabelen vi deriverer med hensyn på, (define (same-variable? v1 v2) (and (variable? v1) (variable? v2) (eq? v1 v2))) ; Her hadde det holdt med ett kall på variable? fordi ; hvis den ene av v1 og v2 er en variabel ; vil ikke eq? returnere true med mindre også den andre er en variabel. 268

13 Summer og produkter er lister med Scheme's prefixform der første element er en operand-tag (define (make-sum a1 a2) (list '+ a1 a2)) (define (sum? exp) ; Et uttrykk er en sum (and (pair? exp) ; hvis det er et par, og (eq? (car exp) '+))) ; dets første element er symbolet +, (define (addend sum) (cadr sum)) ; Andre element er det som får noe lagt til seg. (define (augend sum) (caddr sum)) ; Tredje element er det som legges til. (define (make-product a1 a2) (list '* a1 a2)) (define (product? exp) ; Et uttrykk er et produkt (and (pair? exp) ; hvis det er et par, og (eq? (car exp) '*))) ; dets første element er symbolet *. (define (multiplier sum) (cadr sum)) ; Andre element er det antall ganger noe skal ganges. (define (multiplicand sum) (caddr sum)) ; Tredje element er det som skal ganges. 269

14 Med denne implementasjonen får vi følgende output med de inndata som er vist over. (deriv '(+ x 3) 'x) (+ 1 0) ; regel (3, 2, 1) (deriv '(* x 3) 'x) (+ (* x 0) (* 1 3)) ; regel (4, 2, 1) (deriv '(* x y) 'x) (+ (* x 0) (* 1 y)) ; regel (4, 2, 1) (deriv '(* (* x y) (* x 3)) 'x) (+ (* (* x y) ; regel (4) (+ (* x 0) (* 1 3))) ; regel (3, 2, 1) (* (+ (* x 0) (* 1 y)) ; regel (3, 2, 1) (* x 3))) Til sammenligning viser vi om igjen det output vi kunne ønske oss. (deriv '(+ x 3) 'x) 1 (deriv '(* x 3) 'x) 3 (deriv '(* x y) 'x) y (deriv '(* (* x y) (* x 3)) 'x) 6xy 270

15 Vi kan komme et stykke på vei ved å modifisere konstruktorene, og dette kan vi gjøre uten å endre derivasjonsprosedyren. (define (make-sum a1 a2) (cond ((=number? a1 0) a2) ; addend = 0, så summen = augend ((=number? a2 0) a1) ; augend = 0, så summen = addend ((and (number? a1) (number? a2)) ; begge er tall, så vi returnmerer (+ a1 a2)) ; den numeriske summen (else (list '+ a1 a2)))) (define (make-product m1 m2) (cond ((or (=number? m1 0) (=number? m2 0) 0)) ; minst én faktor = 0, så produktet blir også 0 ((=number? m1 1) m2) ; multiplikand = 1, så produktet = multiplikator ((=number? m2 1) m1) ; multiplikator = 1, så produktet = multiplikand ((and (number? m1) (number? m2)) ; begge er tall, så vi returnmerer (* m1 m2)) ; det numeriske produktet (else (list '* m1 m2)))) 271

16 Sammenligningsfunksjonen =number? x n tar en variabel eller et tall som første argument og et tall (forutsetningsvis) som andre argument, og returnerer true hvis første argument er samme tall som andre. (define (=number? x n) (and (number? x) (= x n))) Dette gir følgende forbedrede output: (deriv '(+ x 3) 'x) 1 (deriv '(* x 3) 'x) 3 (deriv '(* x y) 'x) y (deriv '(* (* x y) (* x 3)) 'x) (+ (* (* x y) 3) (* y (* x 3))) klart bedre enn resultatet av den opprinnelige implementasjonen, (deriv '(* (* x y) (* x 3)) 'x) (+ (* (* x y) (+ (* x 0) (* 1 3))) (* (+ (* x 0) (* 1 y)) (* x 3))) men vi har fremdeles har et stykke igjen. Dette er et tema for ukeoppgavene. 272

17 Representasjon av mengder SICP Schemes liste-begrep gir en mulig representasjon av mengder, forutsatt visse modifikasjoner og presiseringner. Bl.a. må vi ta vare på at - kardinaliteten til en mengde er gitt ved antall distinkte elementer i mengden, mens - lengden til en liste er gitt ved antall elementer overhodet. En bag eller et multiset er en samling av elementer med multiplisitet flere forekomster av samme element / verdi. Mengde (1, 2, 3) = (2, 1, 3) = (1, 1, 2, 3) Multiset (1, 2, 3) = (2, 1, 3) (1, 1, 2, 3) Liste (1, 2, 3) (2, 1, 3) (1, 1, 2, 3) (se under om ordnede mengder) Dette gjør vi (som for rasjonelle tall og algebraiske uttrykk) ved å definere datatypen mengde (set) ved noen grunnoperasjoner i første omgang snitt og union (det siste som øvelse) samt en konstruktor for å legge et element til en mengde, og et predikat for å avgjøre om noe er et medlem i en mengde. 273

18 For å ta det siste først: Scheme har bl.a. semipredikatene memq og member for å sjekke om noe er et element i en liste. I implementasjonen av disse brukes henholdsvis eq? og equal?. SICP bruker fortrinnsvis og vi bruker utelukkende eq? og equal?. Som nevnt over er forskjellen mellom disse generelt den at (eq? x y) returnerer true hvis x og y er identiske altså samme objekt (lokasjon) mens (equal? x y) returnerer true hvis x og y er like, element for element. (define x '(a b c)) (define y (map (lambda (e) e) x)) ; y er nå en kopi av, men ikke identisk med, x. (eq? x y) #f (equal? x y) #t Hva symboler angår, er hele poenget at (eq? sym1 sym2) (equal? sym1 sym2). Som sagt: to symboler som staves likt er identiske (også rent fysisk i maskinen). Gitt to symboler a og b, så gjelder at: (string=? (symbol string a) (symbol string b)) (eq? a b). Se R 5 RS og

19 Primitene member tar et objekt og en liste som argumenter, søker rekursivt gjennom den gitte listen etter det gitte objektet vha. equal og returnerer ved eventuelt funn den delen av listen som begynner med det funne objektet, eller false, hvis objektet ikke ble funnet. Her er vi imidlertid interessert i ekvivalenspredikater snarere enn semipredikater, og definerer ett mht. identitet og ett mht. likhet: (define (memq? elm set) (cond ((null? set) #f) ((eq? elm (car set)) #t) (else (memq? elm (cdr set))))) (define (member? elm set) (cond ((null? set) #f) ((equal? elm (car set)) #t) (else (member? elm (cdr set))))) (memq? 'b '(a b c)) #t (memq? 'd '(a b c)) #f (memq? '(b c) '(a (b c) d)) #f (member? 'b '(a b c)) #t (member? '(b c) '(a (b c) d)) #t Merk at den eksplisitte returverdien #t i andre cond-clausee her ikke er nødvendig ettersom eq? og equal? er ekte predikater og returnerer enten #t eller #f. 275

20 Vi vil ha med predikatet element-of-set? i abstraksjonsbarrieren for mengder. Skulle vi ha ønsket at mengder skulle kunne inneholde mengder, måtte vi ha definert element-of-set? vha. member?. Men om vi ønsker ordnede mengder, kan vi ikke tillate mengder i mengder For å kunne legge et element inn i en mengde definerer vi: (define (adjoin-set x set) (if (element-of-set? x set) set (cons x set))) Prosedyren returnerer den aktuelle mengden, etter at det gitte elementet evt. er lagt inn. Når vil velger å unngå duplisering av elementer er det av pragmatiske grunner, for å forenkle mengdesoprasjoner som snitt og union. 276

21 Snittoperasjonen kan vi definere slik: (define (intersection-set set1 set2) ;S (cond ((or (null? set1) (null? set2)) '()) ;én eller begge lister er tomme, så ingen flere felles elementer ((element-of-set? (car set1) set2) ;set1-elementet finnes i begge mengdene (cons (car set1) (intersection-set (cdr set1) set2))) (else (intersection-set (cdr set1) set2)))) ;set1-elementet finnes ikkje i set2. (intersection-set '(a b d g h i) '(b c d e h k)) (b d h) Ser vi på arbeidsmengden her, finner vi at element-of-set? og adjoin-set, som kaller element-of-set? én gang, har linær arbeidsmengde, mens intersection-set som kaller element-of-set? for hvert element i den ene argumentmengden, har kvadratisk arbeidmsengde. Det samme vil union-operasjonen få. 277

22 Merk at set2 forblir uendret gjennom alle rekursive kall, og testen (null? set2) er dermed bare relevant ved første kall på intersection. For å tydeliggjøre dette, kunne vi ha skrevet prosedyren slik: (define (intersection-set set1 set2) (define (iter set1) (cond ((null? set1) '()) ((member (car set1) set2) (cons (car set1) (iter (cdr set1)))) (else (iter (cdr set1))))) (if (null? set2) '() (iter set1))) Og dette gir dessuten, som man ser, en iterativ prosess. 278

23 Mengder som ordnede lister En ordnet mengde er et par (S, R) der - S er en mengde og - R er en binær ordningsrelasjon på mengdens elementer, typisk mengden av tallene og relasjonen, (Z, ). Par-relasjonen gjør lister god egnet for representasjon av ordnede mengder, der car og cdr alltid angir det første og det etterfølgende element. Vårt anliggende her er imidlertid ikke ordnede mengder, men å effektivisere mengdesoprasjonene ved hjelp av ordnede lister Ved operasjoner på ordnede lister kan vi redusere den linære søkelengden fra n til n/2 for elementer som ikke blir funnet. Men fremfor alt kan vi redusere arbeidsmengden for snitt og union fra kvadratisk til lineær. I Scheme er også parene (character, char<=?) og (string, string<=?) ordnede mengder, men her begrenser vi oss til å se på mengder av tall. Vi søker i en uordnet liste L. - Hvis det for hvert søk x er svært sannsynlig at x er i L, får vi en gjennomsnittlig søkelengde = L /2, og - hvis det for hvert søk x er svært lite sannsynlig at x er i L, får vi en gjennomsnittlig søkelengde = L, men, som det fremgår av neste side, - hvis L var ordnet, ville vi i begge tilfeller få en gjennomsnittlig søkelengde = L /2. ( L = lengden til L.) 279

24 Halvering av linær søkelengde i en ordnet mengde: (define (element-of-set? elem set) (cond ((null? set) #f) ((= elem (car set)) #t) ((< elem (car set)) #f) (else (element-of-set? elem (cdr set))))) Effektiviseringen oppnås ved at vi stopper når det evt. ikke er noe vits i å lete lenger (element-of-set? 3 '( )) #f Vi stopper her når vi kommet halveis, og ser at det søkte elementet ikke kan ligge lenger ut. 280

25 Linearisering av snittoperasjon vha. parallell gjennomløping av de ordnede argumentmengdene (define (intersection-set set1 set2) (if (or (null? set1) (null? set2)) '() (let ((x1 (car set1)) (x2 (car set2))) (cond ((< x1 x2) (intersection-set (cdr set1) set2)) ((< x2 x1) (intersection-set set1 (cdr set2))) (else ; x1 = x2 (cons x1 (intersection-set (cdr set1) (cdr set2)))))))) (intersection-set '( ) ( ) '( )) 281

26 Ovenstående utforming av algoritmen avviker et ørlite grann fra lærebokens, idet vi nøyer oss med å teste for to av de tre mulige størrelsesrelasjonene mellom x1 og x2 og lar den tredje være implisert i else-grenen. La oss følge utførelsen av ovenstående kall, idet (vi later som om ) snittet fylles opp underveis. runde set1 x1 set2 x2 snitt 1 ( ) 1 ( ) 2 () 2 ( ) 2 ( ) 2 () 3 ( ) 4 ( ) 3 (2) 4 ( ) 4 ( ) 4 (2) 5 (7 8 9) 7 (5 8 10) 5 (2 4) 6 (7 8 9) 7 (8 10) 8 (2 4) 7 (8 9) 8 (8 10) 8 (2 4) 9 (9) 9 (10) 10 (2 4 8) 10 () (2 4 8) Vi ser at får en arbeidsmengde n + m. Siden prosedyren gir en rekursiv prosess, vil i realiteten snittet ikke fylles opp før rekursjonen avvikles kall for utenforliggende kall. 282

27 Fletting Ovenstående kan sees som en variant av en mer generell flette(merge)-algoritme. Ordinær fletting gir unionen av to mengder med eller uten duplisering av elementer, avhengig av hva som skjer ved likhet (i else-grenen i algoritmen over). Ellers kan vi variere algoritmen mht. når vi cons-er inn nye elementer i resultatmengden. Variasjonene omfatter: - full fletting med multiplisitet (mulige multiple forekomster av elementer) (typisk ved Merge Sort) - union, dvs. fletting med bare unike elementer i resultatmengden - snitt - differansen : set1 set2 eller set2 set1. 283

28 (define (combine-sets set-1 set-2) (cond (<set-1 er gjennomløpt> ; basistilfelle-1 <basisverdi-1>) (<set-2 er gjennomløpt> ; basistilfelle-2 <basisverdi-2>) (else ; almenntilfellet (<identifiser første element fra hver mengde> (cond (<elementet fra set1 er minst> ; almenntilfelle-1 (combine-sets...)) (<elementet fra set2 er minst> ; almenntilfelle-2 (combine-sets...)) (else (combine-sets...)) ; elementene er like Oppgave: Erstatt pseudokoden for å lage hhv. snitt, union og differanse. NB! Ved ren sammenfletting (merge) kan mønsteret forenkles. Oppgave: Implementer fletting på enklest mulig måte. Oppgave: Kan differanse-operasjonen også forenkles, og i så fall hvordan? 284

29 Oppsumering av arbeidsmengden ved operasjoner på ordnede lister La M og N være to mengder. I utgangspunktet vil kostnadene ved en mengdesoperasjon være "kvadratisk", dvs mellom M N /2 og M N, X = størrelsen til X. idet vi sammenligner hvert element i M med hvert element i N. Ved å implementere mengdestypen slik at mengdeselementen ligger i en ordnet liste f.eks. som tall, i stigende orden, kan vi redusere kostnadene ved mengdesoperasjoner fra kvadratisk til lineær, dvs fra M N /2 til M + N, idet vi sammenligner elementene i M med elementene i N, i en parallell gjennomløping av de to mengdene Søking i lister er allerede i utgangspunktet en lineær prosess, så her blir gevinsten ved å ordne mengden i beste fall en halvering av arbeidsmengen. Er sannsynligheten for funn liten får vi en halvering, men er sannynligheten stor, får vi ingen gevinst 285

30 Mengder representert ved binære trær SICP Med hensyn til søking kan vi organisere mengder som binære trær. Et tre er bygget opp av noder f.eks. slik at hver node har en verdi og ingen, ett eller flere subtrær. I et binært tre har ingen node mer enn to subtrær, og i noen binære trær som de vi skal bruke har hver node nøyaktig to subtrær, når et tomt tre også regnes som et subtre. For et binært tre med stigende unike verdier, gjelder følgende krav: For hver node x skal alle noder til venstre for x ha lavere og alle nodene til høyre for x ha høyere verdi enn x. 286

31 Som vi ser av trærne under, som alle representerer mengden {1, 3, 5, 7, 9, 11}, gir dette kravet opphav til flere mulige ulike representasjoner av en og samme mengde, men for at et binært tre skal gi en effektiv organisering mht. søk, må det være balansert (noe vi ikke har tid til å gå inn på her). Antall binære trær med 6 noder = 132 A: '(11 (9 (7 (5 (3 (1 () ()) ()) ()) ()) ()) ()) B: '(7 (3 (1 () ()) (5 () ())) (9 () (11 () ()))) C: '(3 (1 () ()) (7 (5 () ()) (9 () (11 () ())))) D: '(5 (3 (1 () ()) ()) (9 (7 () ()) (11 () ()))) E: '(1 () (3 () (5 () (7 () (9 () (11 () ())))))) 287

32 Ved binær søking i en ordnet rekke får vi logaritmisk arbeidsmengde, som i dette eksemplet der vi finner verdien 35 blant 22 verdier ved 4 ( log 2 22) halveringer. Midtpunktet beregnes til n/2 når x = floor(x), dvs. nærmeste heltall <= x. 35 En slik søkemåte forutsetter en struktur der vi har direkte aksess til de enkelte elementene typisk en vektor. I en liste er vi henvist til å søke sekvensielt, men med en trestruktur oppheves denne begrensningen. Riktignok må vi vandre gjennom en sekvens av noder, men søkeveien går via forgreninger, tilsammen ikke mer enn log 2 n, hvis treet er balansert. La l være logaritmen til et tall n mht. en base b, dvs. l = log b n. Da er l det tallet vi må opphøye b i for å få n, dvs. n = b l. F.eks. for n = 1000 og b = 10, har vi l = log = 3 og 10 3 = Når vi beregner antall med binære halveringer, lar vi basen være 2. F.eks. for n = 512 og b = 2, har vi l = log = 9 og 2 9 = 512. Hvis n ligger mellom to potenser av to, f.eks. n = 350 og dermed ligger mellom 2 8 = 256 og 2 9 = 512, må vi i verste fall foreta 9 halveringer for, om mulig, å finne det vi søker i et balansert. tre. 288

33 (22 (8 (4 (2 () ()) (5 () (7 () ()))) Vi finner 35 i fire trinn ved å gå (14 (11 () (12 () ())) fra 22 < 35 til venstre (15 () (21 () ())))) fra 36 > 35 til venstre (36 (31 (24 () (25 () ())) fra 31 < 35 til høyre (32 () (35 () ()))) fra 32 < 35 til høyre (42 (37 () (40 () ())) der vi finner 35 (45 () (48 () ()))))) 289

34 Vi definerer følgende konstruktor og selektorer: (define (make-tree entry left right) (list entry left right)) (define (entry tree) (car tree)) (define (left-branch tree) (cadr tree)) (define (right-branch tree) (caddr tree)) Også ved søking og innsetting, som ved snittoperasjonen over, avviker vi fra læreboken, i det vi lar den tredje av tre mulige tilfeller, nemlig likhet, være implisert i else-grenen. Søkealgoritmen blir da slik: (define (element-of-set? x set) (cond ((null? set) #f) ((< x (entry set)) (element-of-set? x (left-branch set))) ((> x (entry set)) (element-of-set? x (right-branch set))) (else #t))) ; x = (entry set) 290

35 Og innsettingsalgoritmen blir slik: (define (adjoin-set x set) (cond ((null? set) (make-tree x '() '())) ((< x (entry set)) (make-tree (entry set) ((> x (entry set)) (adjoin-set x (left-branch set)) (right-branch set))) (make-tree (entry set) (left-branch set) (adjoin-set x (right-branch set)))) (else set))) Dette kan gi ubalanse. Hvis elementene kommer i stigende orden, får vi i realiteten en ren liste der hvert nytt element havner i høyregren til nederste element. Ovenstående algoritme gjør at alle nye verdier havner nederst i treet, som blader. For å sikre at treet blir balansert, må vi ha muligheten for å plassere nye verdier høyere opp i treet. Dette krever betydelig mer tenking og betydelig mer kode. 291

36 La oss følge innsettingen av 9 i treet på side 279: (a) Treet er ikke tomt, og x = 9 < entry = 22. (b) Lag nytt tre med samme entry, med 9 lagt til i venstre gren og med samme høyregren (c) Treet er ikke tomt, og x = 9 > entry = 8. (d) Lag nytt tre med samme entry og samme venstregren med 9 lagt til i høyre gren (e) Treet er ikke tomt, og x = 9 < entry = 14. (f) Lag nytt tre med samme entry, med 9 lagt til i venstre gren og med samme høyregren (g) Treet er ikke tomt, og x (= 9) < (entry = 11). (h) Lag nytt tre med samme entry, med 9 lagt til i venstre gren og med samme høyregren (i) Treet er tomt (j) Lag nytt tre med 9 som entry og tom venstre- og høyregren. 292

INF2810: Funksjonell Programmering. Trær og mengder

INF2810: Funksjonell Programmering. Trær og mengder INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Trær og mengder Erik Velldal Universitetet i Oslo 19. februar 2015 Tema Forrige uke Høyereordens prosedyrer lambda, let og lokale variabler

Detaljer

INF2810: Funksjonell Programmering. Trær og mengder

INF2810: Funksjonell Programmering. Trær og mengder INF2810: Funksjonell Programmering Trær og mengder Stephan Oepen Universitetet i Oslo 16. februar 2016 Tema 2 Forrige uke Høyereordens prosedyrer lambda, let og lokale variabler Dataabstraksjon I dag Lister

Detaljer

INF2810: Funksjonell Programmering. Trær og mengder

INF2810: Funksjonell Programmering. Trær og mengder INF2810: Funksjonell Programmering Trær og mengder Stephan Oepen Universitetet i Oslo 16. februar 2017 Tema 2 Forrige uke Høyereordens prosedyrer lambda, let og lokale variabler Dataabstraksjon I dag Lister

Detaljer

INF2810: Funksjonell Programmering. Mengder og lokal tilstand

INF2810: Funksjonell Programmering. Mengder og lokal tilstand INF2810: Funksjonell Programmering Mengder og lokal tilstand Stephan Oepen & Erik Velldal Universitetet i Oslo Kvinnedagen, 2013 Forrige gang 2 Dagens dont 3 Del 1 Litt mer om hierarkisk data. Representasjon

Detaljer

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering INF2810: Funksjonell Programmering Høyereordens prosedyrer, lambda og lokale variabler Erik Velldal Universitetet i Oslo 9. februar 2017 Tema 2 Forrige uke Lister og listerekursjon quote Høyereordens prosedyrer

Detaljer

Gjennomgåelse av eksamensoppgaven i HUMIT2710 fra våren 2004

Gjennomgåelse av eksamensoppgaven i HUMIT2710 fra våren 2004 Gjennomgåelse av eksamensoppgaven i HUMIT2710 fra våren 2004 Oppgave 1 For å komme nærmere kvadratroten til et tall fra en foreløpig tilnærming y, kan vi bruke formelen (y + /y)/2. Dette gir grunnlag for

Detaljer

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering INF2810: Funksjonell Programmering Høyereordens prosedyrer, lambda og lokale variabler Erik Velldal Universitetet i Oslo 9. februar 2017 Tema 2 Forrige uke Lister og listerekursjon quote Høyereordens prosedyrer

Detaljer

INF2810: Funksjonell Programmering. Lokale variabler. Og trær.

INF2810: Funksjonell Programmering. Lokale variabler. Og trær. INF2810: Funksjonell Programmering Lokale variabler. Og trær. Erik Velldal Universitetet i Oslo 11. september 2019 Tema forrige uke 2 Lister som datastruktur quote Rekursjon på lister Høyereordens prosedyrer

Detaljer

INF2810: Funksjonell Programmering. Lokale variabler. Og trær.

INF2810: Funksjonell Programmering. Lokale variabler. Og trær. INF2810: Funksjonell Programmering Lokale variabler. Og trær. Erik Velldal Universitetet i Oslo 11. september 2019 Tema forrige uke 2 Lister som datastruktur quote Rekursjon på lister Høyereordens prosedyrer

Detaljer

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering INF2810: Funksjonell Programmering Omgivelsesmodeller og destruktive listeoperasjoner Stephan Oepen & Erik Velldal Universitetet i Oslo 15. mars 2013 Tema 2 Forrige uke Representasjon av mengder Sorterte

Detaljer

(define (naer-nok-kuberot? y x) (< (abs (- (kube y) x)) 0.001)) (define (naermere-kuberot y x) (/ (+ (* y 2) (/ x (kvadrat y))) 3))

(define (naer-nok-kuberot? y x) (< (abs (- (kube y) x)) 0.001)) (define (naermere-kuberot y x) (/ (+ (* y 2) (/ x (kvadrat y))) 3)) Oppgave 1 For å komme nærmere kuberoten (tredjeroten) til et tall x fra en foreløpig tilnærming y, kan vi bruke formelen (2y + x/y 2 )/3. Skriv prosedyrene (nær-nok-kuberot? y x), (nærmere-kuberot y x)

Detaljer

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering INF2810: Funksjonell Programmering Omgivelsesmodeller og destruktive listeoperasjoner Stephan Oepen & Erik Velldal Universitetet i Oslo 15. mars 2013 Tema 2 Forrige uke Representasjon av mengder Sorterte

Detaljer

Innlevering 2a i INF2810, vår 2017

Innlevering 2a i INF2810, vår 2017 Innlevering 2a i INF2810, vår 2017 Hovedtematikken denne gang er Huffman-koding, som ble dekket i 6. forelesning (23. februar) og i seksjon 2.3.4 i SICP. Det er viktig å ha lest denne seksjonen før dere

Detaljer

Eksamen i HUMIT 2710, Funksjonell programmering, våren Ingen hjelpemidler er tillatt. <resten av forsiden> Side 1 av 7

Eksamen i HUMIT 2710, Funksjonell programmering, våren Ingen hjelpemidler er tillatt. <resten av forsiden> Side 1 av 7 Eksamen i HUMIT 2710, Funksjonell programmering, våren 2005 Ingen hjelpemidler er tillatt. Side 1 av 7 Oppgave 1 Rekursjon Fakultetsfunksjonen, her kalt Fak, kan defineres rekursivt

Detaljer

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering INF2810: Funksjonell Programmering Høyereordens prosedyrer, lambda og lokale variabler Stephan Oepen Universitetet i Oslo 9. februar 2015 Tema 2 Forrige uke Lister og listerekursjon quote Høyereordens

Detaljer

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering INF2810: Funksjonell Programmering Høyereordens prosedyrer, lambda og lokale variabler Stephan Oepen Universitetet i Oslo 9. februar 2015 Tema 2 Forrige uke Lister og listerekursjon quote Høyereordens

Detaljer

Rekursjon og lister. Stephan Oepen & Erik Velldal. 1. februar, Universitetet i Oslo

Rekursjon og lister. Stephan Oepen & Erik Velldal. 1. februar, Universitetet i Oslo INF2810: Funksjonell programmering Rekursjon og lister Stephan Oepen & Erik Velldal Universitetet i Oslo 1. februar, 2013 Agenda 2 Forrige uke Scheme Substitusjonsmodellen Blokkstruktur Predikater Kondisjonale

Detaljer

INF2810: Funksjonell Programmering. Dataabstraksjon og Trerekursjon

INF2810: Funksjonell Programmering. Dataabstraksjon og Trerekursjon INF2810: Funksjonell Programmering Dataabstraksjon og Trerekursjon Stephan Oepen & Erik Velldal Universitetet i Oslo 15. februar, 2013 Tema 2 Forrige uke Høyere-ordens prosedyrer: Prosedyrer som argumenter

Detaljer

Oppgave 1 Minimum edit distance

Oppgave 1 Minimum edit distance INF-2810 V 2012 Oppgavesett 10, kalenderuke 12. Oppgave 1 Minimum edit distance Vi vil finne det minste antall redigeringsoperasjoner som kreves for å komme fra strengen A til strengen B. Strengene oppgis

Detaljer

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2 INF2810: Funksjonell programmering INF2810: Funksjonell Programmering En Scheme-evaluator i Scheme, del 2 Erik Velldal Universitetet i Oslo 7. mai 2015 Tema Forrige uke SICP 4.1. Structure and interpretation

Detaljer

Høyere-ordens prosedyrer

Høyere-ordens prosedyrer INF2810: Funksjonell programmering Høyere-ordens prosedyrer Stephan Oepen & Erik Velldal Universitetet i Oslo 8. februar, 2013 Tema 2 Forrige uke Lister og listerekursjon Høyere-ordens prosedyrer Prosedyrer

Detaljer

INF2810: Funksjonell Programmering. Huffman-koding

INF2810: Funksjonell Programmering. Huffman-koding INF2810: Funksjonell Programmering Huffman-koding Stephan Oepen Universitetet i Oslo 1. mars 2016 Tema 2 Sist Trær som lister av lister Trerekursjon Mengder som trær I dag Hierarkisk og symbolsk data Eksempel:

Detaljer

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2 INF2810: Funksjonell Programmering En Scheme-evaluator i Scheme, del 2 Erik Velldal Universitetet i Oslo 4. mai 2017 Tema 2 Forrige uke SICP 4.1. Structure and interpretation of computer programs Metacircular

Detaljer

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme, del 2 INF2810: Funksjonell Programmering En Scheme-evaluator i Scheme, del 2 Erik Velldal Universitetet i Oslo 4. mai 2017 Tema 2 Forrige uke SICP 4.1. Structure and interpretation of computer programs Metacircular

Detaljer

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer INF2810: Funksjonell Programmering Lister og høyereordens prosedyrer Erik Velldal Universitetet i Oslo 2. februar 2017 Agenda 2 Forrige uke Substitusjonsmodellen og evalueringsstrategier. Blokkstruktur

Detaljer

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Lister og høyereordens prosedyrer Erik Velldal Universitetet i Oslo 5. februar 2015 Agenda Forrige uke Substitusjonsmodellen og evalueringsstrategier.

Detaljer

INF2810: Funksjonell Programmering. En metasirkulær evaluator

INF2810: Funksjonell Programmering. En metasirkulær evaluator INF2810: Funksjonell Programmering En metasirkulær evaluator Stephan Oepen & Erik Velldal Universitetet i Oslo 26. april 2013 Tema 2 Forrige uke Strømmer og utsatt evaluering Memoisering Kort om makroer

Detaljer

INF2810: Funksjonell Programmering. Kommentarer til prøveeksamen

INF2810: Funksjonell Programmering. Kommentarer til prøveeksamen INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Kommentarer til prøveeksamen Erik Velldal Universitetet i Oslo 1: Grunnleggende (6 poeng)? (define foo '(a b))? (define bar foo)? (set!

Detaljer

INF2810: Funksjonell Programmering. En metasirkulær evaluator

INF2810: Funksjonell Programmering. En metasirkulær evaluator INF2810: Funksjonell Programmering En metasirkulær evaluator Stephan Oepen & Erik Velldal Universitetet i Oslo 26. april 2013 Tema 2 Forrige uke Strømmer og utsatt evaluering Memoisering Kort om makroer

Detaljer

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme INF2810: Funksjonell Programmering En Scheme-evaluator i Scheme Erik Velldal Universitetet i Oslo 19. april 2016 Tema 2 Forrige uke Strømmer og utsatt evaluering Kort om makroer I dag Kap. 4 Metasirkulær

Detaljer

IN2040: Funksjonell programmering. Trær, mengder og huffmankoding

IN2040: Funksjonell programmering. Trær, mengder og huffmankoding IN2040: Funksjonell programmering Trær, mengder og huffmankoding Erik Velldal Universitetet i Oslo 18. september 2019 Tema 2 Forrige uke lambda, let og lokale variabler Dataabstraksjon Lister av lister:

Detaljer

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO Side 1 UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i: INF2810 Eksamensdag: 7. juni Tid for eksamen: 14.30 Oppgavesettet er på 5 sider Vedlegg Relevante prosedyrer Tillatte

Detaljer

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i: INF2810 Eksamensdag: Fredag 5. juni 2015 Tid for eksamen: 14:30 (4 timer) Oppgavesettet er på 4 sider (ikke medregnet denne siden)

Detaljer

INF2810: Funksjonell Programmering. En metasirkulær evaluator, del 2

INF2810: Funksjonell Programmering. En metasirkulær evaluator, del 2 INF2810: Funksjonell Programmering En metasirkulær evaluator, del 2 Stephan Oepen & Erik Velldal Universitetet i Oslo 03. mai 2013 Tema 2 Forrige uke SICP 4.1. Structure and interpretation of computer

Detaljer

INF2810: Funksjonell Programmering. En metasirkulær evaluator, del 2

INF2810: Funksjonell Programmering. En metasirkulær evaluator, del 2 INF2810: Funksjonell Programmering En metasirkulær evaluator, del 2 Stephan Oepen & Erik Velldal Universitetet i Oslo 03. mai 2013 Tema 2 Forrige uke SICP 4.1. Structure and interpretation of computer

Detaljer

INF2810: Funksjonell Programmering. Huffman-koding

INF2810: Funksjonell Programmering. Huffman-koding INF2810: Funksjonell Programmering Huffman-koding Stephan Oepen Universitetet i Oslo 1. mars 2016 Tema 2 Sist Trær som lister av lister Trerekursjon Mengder som trær I dag Hierarkisk og symbolsk data Eksempel:

Detaljer

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme INF2810: Funksjonell Programmering En Scheme-evaluator i Scheme Erik Velldal Universitetet i Oslo 27. april 2017 Tema 2 Forrige forelesning Strømmer og utsatt evaluering Kort om makroer I dag Kap. 4 Metasirkulær

Detaljer

Par og Lister (først et par sider fra forrige uke) Par er byggestener for lister og trær og sammensatte datatyper.

Par og Lister (først et par sider fra forrige uke) Par er byggestener for lister og trær og sammensatte datatyper. Par og Lister (først et par sider fra forrige uke) Par er byggestener for lister og trær og sammensatte datatyper. Par kan representeres grafiske slik: Som vi ser kan vi bruke cons til å lage par hvis

Detaljer

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel ) INF2220: Forelesning 1 Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel 4.1-4.3 + 4.6) PRAKTISK INFORMASJON 2 Praktisk informasjon Kursansvarlige Ragnhild Kobro Runde (ragnhilk@ifi.uio.no)

Detaljer

INF2810: Funksjonell Programmering. Huffman-koding

INF2810: Funksjonell Programmering. Huffman-koding INF2810: Funksjonell Programmering Huffman-koding Stephan Oepen & Erik Velldal Universitetet i Oslo 22. februar, 2013 Tema 2 Forrige uke Data-abstraksjon Lister av lister Tre-rekursjon Prosedyrer som datastruktur

Detaljer

INF2810: Funksjonell Programmering. Huffman-koding

INF2810: Funksjonell Programmering. Huffman-koding INF2810: Funksjonell Programmering Huffman-koding Stephan Oepen & Erik Velldal Universitetet i Oslo 22. februar, 2013 Tema 2 Forrige uke Data-abstraksjon Lister av lister Tre-rekursjon Prosedyrer som datastruktur

Detaljer

Eksamen i SLI230, vår 2003.

Eksamen i SLI230, vår 2003. Eksamen i SLI230, vår 2003. Oppgavesettet har 8 sider medregnet denne forsiden. Ingen hjelpemidler er tillatt. Vedlegg: To sider som inneholder en liste over primitiver fra scheme (og simply.scm) samt

Detaljer

INF2810: Funksjonell Programmering. Huffmankoding

INF2810: Funksjonell Programmering. Huffmankoding INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Huffmankoding Erik Velldal Universitetet i Oslo 20. februar 2015 Tema I går Trær som lister av lister Trerekursjon Mengder som trær

Detaljer

INF2810: Funksjonell programmering: Mer om Scheme. Rekursjon og iterasjon.

INF2810: Funksjonell programmering: Mer om Scheme. Rekursjon og iterasjon. INF2810: Funksjonell programmering: Mer om Scheme. Rekursjon og iterasjon. Stephan Oepen & Erik Velldal Universitetet i Oslo 25. januar, 2013 På blokka 2 Forrige uke Introduksjon og oversikt Funksjonell

Detaljer

Side 1. Oppgave 1. Prosedyrer 1.1. Prosedyrene f og g skal begge returnere prosedyrer. a. Skriv f slik at ((f a) b) returnerer summen av a og b.

Side 1. Oppgave 1. Prosedyrer 1.1. Prosedyrene f og g skal begge returnere prosedyrer. a. Skriv f slik at ((f a) b) returnerer summen av a og b. Side 1 Oppgave 1. Prosedyrer 1.1. Prosedyrene f og g skal begge returnere prosedyrer. a. Skriv f slik at ((f a) b) returnerer summen av a og b. (define (f a) (lambda (b) (add a b ))) b. Skriv g, uten å

Detaljer

LISP PVV-kurs 25. oktober 2012

LISP PVV-kurs 25. oktober 2012 LISP PVV-kurs 25. oktober 2012 Hva er Lisp? Grunnleggende konsepter Variabler (Pause) Lister Løkker Funksjoner Oversikt over kurset Først: Få tak i en implementasjon av Common Lisp Mange implementasjoner

Detaljer

INF2810: Funksjonell Programmering. Huffman-koding

INF2810: Funksjonell Programmering. Huffman-koding INF2810: Funksjonell Programmering Huffman-koding Erik Velldal Universitetet i Oslo 23. februar 2017 Tema 2 Sist Trær som lister av lister Trerekursjon Mengder som trær Dataabstraksjon I dag Hierarkisk

Detaljer

INF2810: Funksjonell Programmering. Mer om verditilordning og muterbare data.

INF2810: Funksjonell Programmering. Mer om verditilordning og muterbare data. INF2810: Funksjonell Programmering Mer om verditilordning og muterbare data. Erik Velldal Universitetet i Oslo 16. mars 2017 De siste ukene: destruktive operasjoner 2 set! endrer verditilordningen til

Detaljer

INF2810: Funksjonell Programmering. Mer om verditilordning og muterbare data.

INF2810: Funksjonell Programmering. Mer om verditilordning og muterbare data. INF2810: Funksjonell Programmering Mer om verditilordning og muterbare data. Erik Velldal Universitetet i Oslo 16. mars 2017 De siste ukene: destruktive operasjoner 2 set! endrer verditilordningen til

Detaljer

INF2810: Funksjonell Programmering. Mer om verditilordning. Tabeller. Og strømmer.

INF2810: Funksjonell Programmering. Mer om verditilordning. Tabeller. Og strømmer. INF2810: Funksjonell Programmering Mer om verditilordning. Tabeller. Og strømmer. Erik Velldal Universitetet i Oslo 29. mars 2016 De siste ukene: destruktive operasjoner 2 set! endrer verditilordningen

Detaljer

Hva er en algoritme? INF HØSTEN 2006 INF1020. Kursansvarlige Ragnar Normann E-post: Dagens tema

Hva er en algoritme? INF HØSTEN 2006 INF1020. Kursansvarlige Ragnar Normann E-post: Dagens tema va er en algoritme? Vanlig sammenligning: Oppskrift. nput lgoritme NF1020 - ØSTEN 2006 Kursansvarlige Ragnar Normann E-post: ragnarn@ifi.uio.no Output Knuth : tillegg til å være et endelig sett med regler

Detaljer

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO Side 1 UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i: INF2810 Eksamensdag: 6. juni Tid for eksamen: 14.30 Oppgavesettet er på 4 sider pluss vedlegg Tillatte hjelpemiddel: Ingen

Detaljer

INF2810: Funksjonell Programmering. Mer om verditilordning. Tabeller. Og strømmer.

INF2810: Funksjonell Programmering. Mer om verditilordning. Tabeller. Og strømmer. INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Mer om verditilordning. Tabeller. Og strømmer. Erik Velldal Universitetet i Oslo 29. mars 2016 De siste ukene: destruktive operasjoner

Detaljer

INF Algoritmer og datastrukturer. Hva er INF2220? Algoritmer og datastrukturer

INF Algoritmer og datastrukturer. Hva er INF2220? Algoritmer og datastrukturer Praktiske opplysninger INF2220 - Algoritmer og datastrukturer HØSTEN 2007 Institutt for informatikk, Universitetet i Oslo Tid og sted: Mandag kl. 12:15-14:00 Store auditorium, Informatikkbygningen Kursansvarlige

Detaljer

INF2810: Funksjonell Programmering. Eksamensforberedelser

INF2810: Funksjonell Programmering. Eksamensforberedelser INF2810: Funksjonell Programmering Eksamensforberedelser Stephan Oepen & Erik Velldal Universitetet i Oslo 24. mai 2013 I dag 2 Kort oppsummering Praktisk om eksamen Hvem vant konkurransen om flest oblig-poeng

Detaljer

Definisjon: Et sortert tre

Definisjon: Et sortert tre Binære søketrær Definisjon: Et sortert tre For alle nodene i et binært søketre gjelder: Alle verdiene i nodens venstre subtre er mindre enn verdien i noden Alle verdiene i nodens høyre subtre er større

Detaljer

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i: INF2810 Eksamensdag: 5. juni, 2014 Tid for eksamen: 14:30 (4 timer) Oppgavesettet er på 4 sider. Vedlegg: Ingen Tillatte hjelpemidler:

Detaljer

Fra Kap.10 Binære søketre (BS-tre) Sist oppdatert 20.03.10 Definere en abstrakt datastruktur binært søketre. Vise hvordan binær søketre kan brukes

Fra Kap.10 Binære søketre (BS-tre) Sist oppdatert 20.03.10 Definere en abstrakt datastruktur binært søketre. Vise hvordan binær søketre kan brukes Fra Kap.10 Binære søketre (BS-tre) Sist oppdatert 20.03.10 Definere en abstrakt datastruktur binært søketre. Vise hvordan binær søketre kan brukes til å løse problemer. Undersøke ulike implementasjoner

Detaljer

Definisjon av binært søketre

Definisjon av binært søketre Binære søketrær Definisjon av binært søketre For alle nodene i et binært søketre gjelder: Alle verdiene i nodens venstre subtre er mindre enn verdien i noden Alle verdiene i nodens høyre subtre er større

Detaljer

INF2810: Funksjonell Programmering. Muterbare data

INF2810: Funksjonell Programmering. Muterbare data INF2810: Funksjonell Programmering Muterbare data Stephan Oepen Universitetet i Oslo 15. mars 2016 Agenda Forrige uke Prosedyrebasert objektorientering Lokale tilstandsvariabler Innkapsling + set! Eksempel:

Detaljer

Binære søketrær. En ordnet datastruktur med raske oppslag. Sigmund Hansen

Binære søketrær. En ordnet datastruktur med raske oppslag. Sigmund Hansen Binære søketrær En ordnet datastruktur med raske oppslag Sigmund Hansen Lister og trær Rekke (array): 1 2 3 4 Lenket liste (dobbelt-lenket): 1 2 3 4 Binært søketre: 3 1 4 2 Binære

Detaljer

Vi skal se på lambda-uttrykk. Følgende er definerte og vil bli brukt gjennom oppgaven

Vi skal se på lambda-uttrykk. Følgende er definerte og vil bli brukt gjennom oppgaven SLI 230 - side 2 av 8 EKSAMENSOPPGAVE - SLI 230 - VÅR 2000 Nedenfor følger eksamensoppgaver i SLI 230. Først om oppgavene Bakerst følger to sider med hjelp slik det er avtalt - liste over primitiver fra

Detaljer

Definisjon. I et binært tre har hver node enten 0, 1 eller 2 barn

Definisjon. I et binært tre har hver node enten 0, 1 eller 2 barn Binære trær Definisjon I et binært tre har hver node enten 0, 1 eller 2 barn Rekursiv definisjon: Et binært tre er enten tomt, eller: Består av en rotnode og to binære trær som kalles venstre subtre og

Detaljer

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i IN 115 og IN 110 Algoritmer og datastrukturer Eksamensdag: 14. mai 1996 Tid for eksamen: 9.00 15.00 Oppgavesettet er på 8 sider.

Detaljer

INF1010 notat: Binærsøking og quicksort

INF1010 notat: Binærsøking og quicksort INF1010 notat: Binærsøking og quicksort Ragnhild Kobro Runde Februar 2004 I dette notatet skal vi ta for oss ytterligere to eksempler der rekursjon har en naturlig anvendelse, nemlig binærsøking og quicksort.

Detaljer

INF2810: Funksjonell programmering: Introduksjon

INF2810: Funksjonell programmering: Introduksjon INF2810: Funksjonell programmering: Introduksjon Stephan Oepen & Erik Velldal Universitetet i Oslo 18. januar, 2013 Tema for i dag 2 Introduksjon Praktiske detaljer Pensum Obliger Lærebok Hva skal vi lære?

Detaljer

Innlevering 2b i INF2810, vår 2017

Innlevering 2b i INF2810, vår 2017 Innlevering 2b i INF2810, vår 2017 Dette er del to av den andre obligatoriske oppgaven i INF2810. Man kan oppnå 10 poeng for oppgavene i 2b, og man må ha minst 12 poeng tilsammen for 2a + 2b for å få godkjent.

Detaljer

INF2810: Funksjonell Programmering. Huffman-koding

INF2810: Funksjonell Programmering. Huffman-koding INF2810: Funksjonell Programmering Huffman-koding Erik Velldal Universitetet i Oslo 23. februar 2017 Tema 2 Sist Trær som lister av lister Trerekursjon Mengder som trær Dataabstraksjon I dag Hierarkisk

Detaljer

MAT1030 Diskret matematikk

MAT1030 Diskret matematikk MAT1030 Diskret matematikk Forelesning 26: Trær Dag Normann Matematisk Institutt, Universitetet i Oslo 28. april 2008 Oppsummering Sist forelesning snakket vi i hovedsak om trær med rot, og om praktisk

Detaljer

Sist forelesning snakket vi i hovedsak om trær med rot, og om praktisk bruk av slike. rot. barn

Sist forelesning snakket vi i hovedsak om trær med rot, og om praktisk bruk av slike. rot. barn Forelesning 26 Trær Dag Normann - 28. april 2008 Oppsummering Sist forelesning snakket vi i hovedsak om trær med rot, og om praktisk bruk av slike. rot barn barn barnebarn barnebarn barn blad Her er noen

Detaljer

MAT1030 Diskret Matematikk

MAT1030 Diskret Matematikk MAT1030 Diskret Matematikk Forelesning 26: Trær Roger Antonsen Institutt for informatikk, Universitetet i Oslo 5. mai 2009 (Sist oppdatert: 2009-05-06 22:27) Forelesning 26 MAT1030 Diskret Matematikk 5.

Detaljer

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær:

INF110 Algoritmer og datastrukturer TRÆR. Vi skal i denne forelesningen se litt på ulike typer trær: TRÆR Vi skal i denne forelesningen se litt på ulike typer trær: Generelle trær (kap. 4.1) Binærtrær (kap. 4.2) Binære søketrær (kap. 4.3) Den siste typen trær vi skal behandle, B-trær (kap. 4.7) kommer

Detaljer

Oppsummering. MAT1030 Diskret matematikk. Oppsummering. Oppsummering. Eksempel

Oppsummering. MAT1030 Diskret matematikk. Oppsummering. Oppsummering. Eksempel MAT1030 Diskret matematikk Forelesning 26: Trær Sist forelesning snakket vi i hovedsak om trær med rot, og om praktisk bruk av slike. rot Dag Normann Matematisk Institutt, Universitetet i Oslo barn barn

Detaljer

INF2220: Forelesning 2

INF2220: Forelesning 2 INF2220: Forelesning 2 Mer om analyse av algoritmer Analyse av binære søketrær Balanserte søketrær Rød-svarte trær (kapittel12.2) B-trær (kapittel 4.7) ANALYSE AV ALGORITMER 2 Analyse av tidsforbruk Hvor

Detaljer

INF2810: Funksjonell Programmering. Tilstand og verditilordning

INF2810: Funksjonell Programmering. Tilstand og verditilordning INF2810: Funksjonell Programmering Tilstand og verditilordning Stephan Oepen Universitetet i Oslo 2. mars 2017 Forrige gang 2 I dag 3 Vi blar om til kapittel 3 i SICP. Tilstand og verditilordning. Destruktive

Detaljer

Binære trær: Noen algoritmer og anvendelser

Binære trær: Noen algoritmer og anvendelser Binære trær: Noen algoritmer og anvendelser Algoritmer / anvendelser: Søking i usortert binært tre Telling av antall noder og nivåer i treet Traversering av binære trær Binære uttrykkstrær Kunstig intelligens(?):

Detaljer

Binære søketrær. Et notat for INF1010 Stein Michael Storleer 16. mai 2013

Binære søketrær. Et notat for INF1010 Stein Michael Storleer 16. mai 2013 Binære søketrær Et notat for INF Stein Michael Storleer 6. mai 3 Dette notatet er nyskrevet og inneholder sikkert feil. Disse vil bli fortløpende rettet og datoen over blir oppdatert samtidig. Hvis du

Detaljer

Obligatorisk oppgave 1 INF1020 h2005

Obligatorisk oppgave 1 INF1020 h2005 Obligatorisk oppgave 1 INF1020 h2005 Frist: fredag 7. oktober Oppgaven skal løses individuelt, og må være godkjent for å kunne gå opp til eksamen. Før innlevering må retningslinjene Krav til innleverte

Detaljer

Memoisering, utsatt evaluering og strømmer

Memoisering, utsatt evaluering og strømmer Memoisering, utsatt evaluering og strømmer Først litt repetisjon: Utsatt evaluering Gitt (define (p x) (if test (x) something-else)) la E være et Scheme-uttrykk, og la L = (lambda () E). Da vil, ved kallet

Detaljer

Memoisering, utsatt evaluering og strømmer

Memoisering, utsatt evaluering og strømmer Memoisering, utsatt evaluering og strømmer Først litt repetisjon: Utsatt evaluering Gitt (define (p x) (if test (x) something-else)) la E være et Scheme-uttrykk, og la L = (lambda () E). Da vil, ved kallet

Detaljer

Par og Lister (først et par sider fra forrige uke) Par er byggestener for lister og trær og sammensatte datatyper.

Par og Lister (først et par sider fra forrige uke) Par er byggestener for lister og trær og sammensatte datatyper. Par og Lister (først et par sider fra forrige uke) Par er byggestener for lister og trær og sammensatte datatyper. Par kan representeres grafiske slik: Som vi ser kan vi bruke cons til å lage par hvis

Detaljer

INF2810: Funksjonell Programmering. Tilstand og verditilordning

INF2810: Funksjonell Programmering. Tilstand og verditilordning INF2810: Funksjonell Programmering Tilstand og verditilordning Erik Velldal Universitetet i Oslo 1. mars 2018 Forrige gang 2 Kode som trær 3 Ved evaluering oversettes kildekoden i et språk først til et

Detaljer

Løsnings forslag i java In115, Våren 1998

Løsnings forslag i java In115, Våren 1998 Løsnings forslag i java In115, Våren 1998 Oppgave 1 // Inne i en eller annen klasse private char S[]; private int pardybde; private int n; public void lagalle(int i) if (i==n) bruks(); else /* Sjekker

Detaljer

Kap 9 Tre Sist oppdatert 15.03

Kap 9 Tre Sist oppdatert 15.03 Kap 9 Tre Sist oppdatert 15.03 Definere et tre som en datastruktur. Definere begreper knyttet til tre. Diskutere mulige implementasjoner av tre Analysere implementasjoner av tre som samlinger. Diskutere

Detaljer

INF2810: Funksjonell Programmering. Strømmer og utsatt evaluering

INF2810: Funksjonell Programmering. Strømmer og utsatt evaluering INF2810: Funksjonell Programmering Strømmer og utsatt evaluering Stephan Oepen Universitetet i Oslo 30. mars 2017 Forrige forelesning 2 Mer om (prosedyre)navn, bindinger, og verditilordning Nok en ny abstrakt

Detaljer

INF2810: Funksjonell Programmering. Køer, tabeller, og (litt om) parallelitet

INF2810: Funksjonell Programmering. Køer, tabeller, og (litt om) parallelitet INF2810: Funksjonell Programmering Køer, tabeller, og (litt om) parallelitet Stephan Oepen & Erik Velldal Universitetet i Oslo 5. april 2013 Tema 2 Siste gang Kort om underveisevaluering Destruktive listeoperasjoner

Detaljer

INF2810: Funksjonell Programmering. Tilstand og verditilordning

INF2810: Funksjonell Programmering. Tilstand og verditilordning INF2810: Funksjonell Programmering Tilstand og verditilordning Stephan Oepen Universitetet i Oslo 8. mars 2016 Forrige gang 2 I dag 3 Vi blar om til kapittel 3 i SICP. Tilstand og verditilordning. Destruktive

Detaljer

INF2810: Funksjonell Programmering. Køer, tabeller, og (litt om) parallelitet

INF2810: Funksjonell Programmering. Køer, tabeller, og (litt om) parallelitet INF2810: Funksjonell Programmering Køer, tabeller, og (litt om) parallelitet Stephan Oepen & Erik Velldal Universitetet i Oslo 5. april 2013 Tema 2 Siste gang Kort om underveisevaluering Destruktive listeoperasjoner

Detaljer

Algoritmer og Datastrukturer

Algoritmer og Datastrukturer Eksamen i Algoritmer og Datastrukturer IAI 21899 Høgskolen i Østfold Avdeling for informatikk og automatisering Lørdag 15. desember 2001, kl. 09.00-14.00 Hjelpemidler: Alle trykte og skrevne hjelpemidler.

Detaljer

MAT1030 Diskret matematikk

MAT1030 Diskret matematikk MAT1030 Diskret matematikk Forelesning 33: Repetisjon Dag Normann Matematisk Institutt, Universitetet i Oslo 26. mai 2008 Innledning Onsdag 21/5 gjorde vi oss ferdige med det meste av den systematiske

Detaljer

Innledning. MAT1030 Diskret matematikk. Kapittel 11. Kapittel 11. Forelesning 33: Repetisjon

Innledning. MAT1030 Diskret matematikk. Kapittel 11. Kapittel 11. Forelesning 33: Repetisjon Innledning MAT1030 Diskret matematikk Forelesning 33: Repetisjon Dag Normann Matematisk Institutt, Universitetet i Oslo 26. mai 2008 Onsdag 21/5 gjorde vi oss ferdige med det meste av den systematiske

Detaljer

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Oppsummering og eksamensforberedelser Erik Velldal Universitetet i Oslo 28. mai 2015 I dag Kort oppsummering Praktisk om eksamen Hvem

Detaljer

Norsk informatikkolympiade runde

Norsk informatikkolympiade runde Norsk informatikkolympiade 2016 2017 1. runde Sponset av Uke 46, 2016 Tid: 90 minutter Tillatte hjelpemidler: Kun skrivesaker. Det er ikke tillatt med kalkulator eller trykte eller håndskrevne hjelpemidler.

Detaljer

INF2810: Funksjonell Programmering. Tilstand og verditilordning

INF2810: Funksjonell Programmering. Tilstand og verditilordning INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Tilstand og verditilordning Erik Velldal Universitetet i Oslo 26. februar 2015 Forrige gang 2 I dag Vi blar om til kapittel 3 i SICP.

Detaljer

TDT4105 Informasjonsteknologi, grunnkurs

TDT4105 Informasjonsteknologi, grunnkurs 1 TDT4105 Informasjonsteknologi, grunnkurs Matlab: Sortering og søking Anders Christensen (anders@idi.ntnu.no) Rune Sætre (satre@idi.ntnu.no) TDT4105 IT Grunnkurs 2 Pensum Matlab-boka: 12.3 og 12.5 Stoffet

Detaljer

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser INF2810: Funksjonell Programmering Oppsummering og eksamensforberedelser Erik Velldal & Stephan Oepen Universitetet i Oslo 18. mai 2017 I dag 2 Kort oppsummering Praktisk om eksamen Hvem vant konkurransen

Detaljer

E K S A M E N. Algoritmiske metoder I. EKSAMENSDATO: 11. desember HINDA / 00HINDB / 00HINEA ( 2DA / 2DB / 2EA ) TID:

E K S A M E N. Algoritmiske metoder I. EKSAMENSDATO: 11. desember HINDA / 00HINDB / 00HINEA ( 2DA / 2DB / 2EA ) TID: Høgskolen i Gjøvik Avdeling for Teknologi E K S A M E N FAGNAVN: FAGNUMMER: Algoritmiske metoder I L 189 A EKSAMENSDATO: 11. desember 2001 KLASSE: 00HINDA / 00HINDB / 00HINEA ( 2DA / 2DB / 2EA ) TID: 09.00-14.00

Detaljer

Norsk informatikkolympiade runde. Sponset av. Uke 46, 2017

Norsk informatikkolympiade runde. Sponset av. Uke 46, 2017 Norsk informatikkolympiade 2017 2018 1. runde Sponset av Uke 46, 2017 Tid: 90 minutter Tillatte hjelpemidler: Kun skrivesaker. Det er ikke tillatt med kalkulator eller trykte eller håndskrevne hjelpemidler.

Detaljer

INF2810: Funksjonell Programmering. Strømmer og utsatt evaluering

INF2810: Funksjonell Programmering. Strømmer og utsatt evaluering INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Strømmer og utsatt evaluering Erik Velldal Universitetet i Oslo 5. april 2016 Forrige forelesning Mer om (prosedyre)navn, bindinger,

Detaljer

Norsk informatikkolympiade runde

Norsk informatikkolympiade runde Norsk informatikkolympiade 2015 2016 1. runde Sponset av Uke 46, 2015 Tid: 90 minutter Tillatte hjelpemidler: Kun skrivesaker. Det er ikke tillatt med kalkulator eller trykte eller håndskrevne hjelpemidler.

Detaljer