Par og Lister (først et par sider fra forrige uke) Par er byggestener for lister og trær og sammensatte datatyper.
|
|
- Sandra Mathisen
- 7 år siden
- Visninger:
Transkript
1 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 elementer er par hvilket vil si at par er lukket under cons. Figur 1. Lister er sekvenser av par der car-delen i hvert par er en eller annen verdi og cdr-delen selv er et par som gir resten av listen. En liste er dermed en rekursiv struktur. (cons 1 (cons 2 (cons 3 (cons 4 )))) ( ) Figur 2. Listen over kan vi også konstruere vha primitiven list. (list ) ( ) Den tomme listen er representert grafisk ved en diagonal strek i cdr-boksen, som vist i figur 2. I koden angis den tomme listen med en tom parentes prefikset med en enkel apostrof:. Fra cons til liste I læreboken brukes verdien nil som synonym for den tomme listen, men nil er ikke definert i R 5 RS (cons 1 2) ==> (1. 2) ; ikke en liste, fordi andre argument ikke er en liste (cons 1 '(2)) ==> (1. (2)) ==> (1 2) ; andre argument er en ikke-tom liste (cons 1 ) ==> (1. ()) ==> (1) ; andre argument er den tomme listen (cons '(1) ) ==> ((1). ()) ==> ((1)) ; arg. 1 er en ikke-tom liste og arg.2 er den tomme listen (cons '(1)) ==> ((). (1)) ==> (() 1) ; arg. 1 er den tomme listen og arg.2 er en ikke-tom liste (cons ) ==> ((). ()) ==> (()) ; arg. 1 og arg.2 er begge den tomme listen Merk at den tomme listen, på linje med bl.a. de enkelte tallene og #t og #f, er et unikt ikke-konstruert objekt som evaluerer til seg selv Operasjoner på lister Konstruktoren list tar ingen, ett eller flere argumenter og returnerer listen med de gitte argumentene. Listen konstrueres rekursivt vha. cons. (list ) (cons 1 (list 2 3 4)) (cons 1 (cons 2 (list 3 4))) (cons 1 (cons 2 (cons 3 (list 4))) (cons 1 (cons 2 (cons 3 (cons 4 )))) I hvert ledd (par) p i en liste er (car p) elementet, verdien, i leddet og (cdr p) resten av en listen. (define L (list )) (define M (list (list 1 2) 3 4)) (car L) ==> 1 (car M) ==> (1 2) (cdr L) ==> (2 3 4) (car (car M)) ==> 1 (car (cdr L)) ==> 2 (car (cdr (car M))) ==> 2 (cdr (cdr L)) ==> (3 4) (cdr M) ==> (3 4) Hente ut et element fra en gitt posisjon i en liste. (define (list-ref items n) (if (= n 0) (car items) (list-ref (cdr items) (- n 1)))) Vi teller elementene fra 0, slik at f.eks. det tredje elementet har ref = 2. Merk at underveis angir n posisjonen til det søkte elementet i den gjenværende lista. (list-ref '( ) 2) 3 (list-ref '( ) 5) cdr krever et par, men fikk den tomme listen items n items n ( ) 2 ( ) 5 (2 3 4) 1 (2 3 4) 4 (3 4) 0 (3 4) 3 (4) 2 () 1 list-ref kunne ha vært gort mer robust i forhold til en mulig for stor n, ved en ekstra sjekk for tom liste, men dette ville stort sett ikke ha vært hensiktsmessig, siden en slik feil gjerne er et symptom på dårlig logikk, som vi ønsker å luke ut av koden. Scheme-primtiven list-ref er like lite robust som ovenstående. Å telle fra 0 i stedet for fra 1 er både naturlig og bekvemt i programmering, - naturlig fordi avstanden til første element i en liste eller vektor = 0 - bekvemt ved modulus(klokke)-sekvenser, der restverdi 0 betyr begynnelsen på en ny runde. (klokka går fra 0 til 24, ikke fra 1 til 25). listen er tom men n er ennå ikke
2 Beregne lengden til en liste. (define (length items) (if (null? items) 0 (+ 1 (length (cdr items)))) Iterativ variant (define (length items) (define (length-iter lst n) (if (null? lst) n (length-iter (cdr lst) (+ n 1)))) (length-iter items 0)) Skjøte en liste til en annen (define (append list1 list2) (if (null? list1) ; Basis: list1 er tom, så vi returnerer list2, der alle elementene i list2 ; opprinnelig list1 nå ligger foran første element i opprinn. list2. (cons (car list1) ; Allment: Legg første gjenværende element i list1 foran (append (cdr list1) list2)))) ; sammenskjøtingen av resten av list1 og økende list2. (append '(1 2 3) '(4 5 6)). (cons 1 (append '(2 3) '(4 5 6))) (cons 1 (cons 2 (append '(3) '(4 5 6)))) (cons 1 (cons 2 (cons 3 (append '(4 5 6))))) (cons 1 (cons 2 (cons 3 '(4 5 6))))) (cons 1 (cons 2 '( ))))) (cons 1 '( ))))) ( ) Avbildning (mapping) av lister Map (avbildning) Skalering En koblingsoperasjon mellom elementene i to mengder (define (scale-list items factor) F.eks. mellom tall og tall, som i scale-list, (if (null? items) eller mellom tall og tegn, i en tegntabell. Eller m.a.o: Gitt mengdene A og B: En assossiasjon (cons (* factor (car items)) mellom hvert element i A og et eller annet element i B. (scale-list (cdr items) factor)))) Eller m.a.o: En avbildning f : A B er en funksjon f (scale-list '( ) 10) slik at det for hver a A finnes et element f(a) B. (cons (* 1 10) (scale-list '( ) 10)) (cons (* 1 10) (cons (* 2 10) (scale-list '(3 4 5) 10)))... (cons 10 (cons 20 (cons 30 (cons 40 (cons 50 ))))) ( ) Filtrering av en liste (define (remove-evens int-list) (cond ((null? int-list) ) ((even? (car int-list)) (remove-evens (cdr int-list))) (else (cons (car int-list) (remove-items (cdr int-list)))))) (define (filter predicate sequence) (cond ((null? sequence) ) ((predicate (car sequence)) (cons (car sequence) (filter predicate (cdr sequence)))) (else (filter predicate (cdr sequence))))) (filter odd? '( ))) ==> ( ) (filter (lambda (x) (= 0 (remainder x 3))) '( ))) ==> (3 6 9) odd? og even? er biblioteksrutiner
3 Eksempel på lister med annet enn tall (define (count-vowals letters) (cond ((null? letters) 0) ((member (car letters) '(a e i o u y æ ø å)) (+ 1 (count-vowals (cdr letters)))) (else (count-vowals (cdr letters))))) ; er dennet bokstaven i mengden av vokaler? Generisk mapping (define (map proc items) (if (null? items) (cons (proc (car items)) (map proc (cdr items))))) Mapping fra heltall til heltall (count-vowals '(i n s t i t u t t f o r i n f o r m a t i k k)) 8 Primitiven member (Se R 5 RS 6.3.2) er et semipredikat som tar en verdi og en liste og returnerer enten listen f.o.m. første forekomst av den gitte verdien, For semipredikater bruker vi konvensjonelt eller #f, hvis verdien ikke ble funnet i listen. ikke et spørsmålstegn sist i navnet. (member 'u '(a e i o u y æ ø å)) ==> (u y æ ø å) (member 's '(a e i o u y æ ø å)) ==> #f (define (vowal? c) (member c '(a e i o u y æ ø å))) (filter vowal? '(p y t h o n)) (y o) (length (filter vowal? '(i n s t i t u t t f o r i n f o r m a t i k k))) 8 (map (lambda (x) (* x x x)) '( )) ( ) Mapping fra heltall til boolean (map even? '( )) (#f #t #f #t) Mapping fra heltall til symbol (map (lambda (x) (if (odd? x) 'odd 'even)) '( )) (odd even odd even) Skalering ved mapping (define (scale-list items factor) Hvis vi substituerer map med dens definisjon, får vi (map (lambda (x) (* x factor)) items)) scale-list slik den er definert på forrige side Hierarkiske strukturer trær Her er et lite tre med 6 noder, hvorav 4 er blader, dvs. ikke-par. (define tre (cons (list 1 2) (list 3 4))) Vi merker oss at treet er en liste med tre elementer, hvorav det første selv er en liste. (length tre) 3 Gitt en prosedyre count-leaves som teller bladene i et gitt tre (her 1, 2, 3, 4) får vi. (count-leaves tre) 4 ; implementasjonen står på neste side Om vi dobler treet ved å lage en liste med treet selv og én to kopi, (define dobbelttre (list tre tre) (((1 2) 3 4) ((1 2) 3 4))) får vi: (length dobbelttre) 2 (count-leaves dobbelttre) 8 For å telle bladene i et tre, må vi forholde oss til at noen elementer er trær, dvs. lister, mens andre er blader og skal telles. Vi har ikke innført noe liste-predikat, men vi har et par-predikat, Det finnes også en primitiv list? og i og med at en liste er et par, kan vi bruke dette. men den tar vi senere. (define (count-leaves x) (cond ((null? x) 0) ; null? gir #t for den tomme listen #f for alt annet ((not (pair? x)) 1) ; x er et blad, så legg til 1 (else ; x er et ikke-tomt tre, så (+ (count-leaves (car x)) ; tell og legg sammen antall blader i første del (car-delen) (count-leaves (cdr x)))))) ; og antall blader i resten av listen (cdr-delen) (count-leaves '((1 2) 3 4)) / \ (+ (count-leaves '(1 2)) (count-leaves '(3 4))) (+ (+ 1 (count-leaves '(2)) (+ 1 (count-leaves '(4))) (+ (+ 1 (+ 1 (count-leaves ))) (+ 1 (+ 1 (count-leaves )))) (+ (+ 1 (+ 1 0))) (+ 1 (+ 1 0))) (+ (+ 1 1) (+ 1 1)) \ / (+ 2 2) 4 Den parallellprosesseringen som er vist her, er ikke reell. Som kjent vil evalueringen av første ledd i et sammensattuttrykk gå til bunns før evalueringen av andre ledd starter
4 Merk testfølgen i prosedyren over. Den tomme listen tilfredstiller begge testene (null? x) og (not (pair? x)). Hadde vi snudd testrekkeølgen ville vi ha også ha talt med tomme grener. I koden under er testrekkefølgen snudd, og den gir dermed gir galt resultat. (define (count-leaves-and-nil x) (cond ((not (pair? x)) 1) ; x er et blad eller nil ((null? x) 0) ; fanges opp av forrige clause, og slår aldri til (else (+ (count-leaves-and-nil (car x)) ; x er et ikke tomt tre (count-leaves-and-nil (cdr x)))))) (count-leaves '((1 2) 3 4)) 4 (count-leaves-and-nil '((1 2) 3 4)) 6 Avbildning av trær Skalering Vi skalerer et tre på tilsvarende måte som vi skalerer en liste, dvs. ved å skalere hvert enkelt data-element (blad). Ellers følger algoritmen samme mønster som bladtellingsalgoritmen. (define (scale-tree tree factor) (cond ((null? tree) ) ; returner det tomme treet ((not (pair? tree)) (* tree factor)) ; returner skaleringen av bladverdien (else (cons (scale-tree (car tree) factor) ; returner et nytt par bestående av (scale-tree (cdr tree) factor))))) ; skaleringen av venstre og høyre sub-tre Legg nøye merke til at returverdien er et nytt tre ikke en modifikasjon av det opprinnelige (scale-tree ((1 2) 3 4) 2) ; skaleringsfaktoren = 2 tre inn (cons ; ytterste cons (scale-tree (1 2) 2) ; arg 1 til ytterste cons (cons ; nest ytterste1 cons (scale-tree 1 2) ; arg 1 til nest ytterste1 cons (* 1 2) ; evaluert arg 1 til nest ytterste1 cons (scale-tree (2) 2) ; arg 2 til nest ytterste1 cons (cons ; innerste cons1 (scale-tree 2 2) ; arg 1 til innerste1 cons (* 2 2) ; evaluert arg 1 til innerste1 cons (scale-tree () 2) ; arg 2 til innerste1 cons1 () ; evaluert arg 2 til innerste1 cons (4) ; evaluert innerste cons1 (4) ; evaluert arg 2 til nest ytterste1 cons (2 4) ; evaluert nest ytterste1 cons (2 4) ; evaluert arg 1 til ytterste cons (scale-tree (3 4) 2) ; arg 2 til ytterste cons (cons ; nest ytterste2 cons (scale-tree 3 2) ; arg 1 til nest ytterste2 cons (* 3 2) ; evaluert arg 1 til nest ytterste2 cons (scale-tree (4) 2) ; arg 2 til nest ytterste2 cons (cons ; innerste2 cons (scale-tree 4 2) ; arg 1 til innerste2 cons (* 4 2) ; evaluert arg 1 til innerste2 cons (scale-tree () 2) ; arg 2 til innerste2 cons () ; evaluert arg 2 til innerste2 cons (8) ; evaluert innerste2 cons tre ut (8) ; evaluert arg 2 til nest ytterste2 cons (6 8) ; evaluert nest ytterste2 cons (6 8) ; evaluert arg 1 til ytterste cons ((2 4) 6 8) ; evaluert ytterste cons ((2 4) 6 8) ; evaluert scale-tree 2 4 Alternativt kan vi skalere treet ved å avbilde hvert subtre slik (define (scale-tree tree factor) (map (lambda (sub-tree) (if (pair? sub-tree) (scale-tree sub-tree factor) ; scalér subtreet (* sub-tree factor))) ; scalér bladet tree)) Her er envariant av ovenstående der vi har gitt den prosedyren vi mapper på, et navn. (define (scale-tree tree factor) (define (scale-sub-tree sub-tree) (if (pair? sub-tree) (scale-tree sub-tree factor) ; scalér subtreet (* sub-tree factor))) ; scalér bladet (map scale-sub-tree tree))
5 Primitiver og bibliotekstprosedyrer for par og lister (pair? obj) ==> #t hvis obj er et par (merk at den tomme listen ikke er et par) (list? obj) ==> #t hvis obj er en liste (null? obj) ==> #t hvis obj er den tomme listen (cons obj1 obj2) ==> paret der første og andre element er hhv.obj1 og obj2 (list obj1...) ==> listen med de gitte objektene (append L1 L2...) ==> sammenskjøtingen av de gitt listene (to eller flere) (car pair) ==> første element i det gitte paret (cdr pair) ==> andre element i det gitte paret (caar L) ==> (car (car L)) (cadr L) ==> (car (cdr L))... (cdddar L) ==> (cdr (cdr (cdr (car L)))) (cddddr L) ==> (cdr (cdr (cdr (cdr L)))) (length L) ==> antall elementer i listen L (reverse L) ==> listen med elementene i listen L i omvendt rekkefølge (list-ref L k) ==> k'te element i listen L, regnet fra 0. (list-tail L k) ==> sublisten av listen L etter de k første elementene (member x L) ==> sublisten av listen L f.o.m. første forekomst av x eller #f, hvis x ikke finnes i L Sekvensielle operasjoner SICP Vi ser på to prosedyrer som tilsynelatende gjør nokså ulike ting. Den ene tar et tre som argument og beregner summen av kvadratene av alle odde tall i treet. (define (sum-odd-squares tree) (cond ((null? tree) 0) ; Basis 0: ikke noe mer i dette subtreet ((not (pair? tree)) ; Basis 1: et tall, (if (odd? tree) (square tree) 0)) ; regn det med hvis det er odde. (else ; Almenntilfellet: et tre (+ (sum-odd-squares (car tree)) ; addér summen for car-subtreet (sum-odd-squares (cdr tree)))))) ; og summen for cdr-subtreet Den andre tar et heltall n og lager en liste over alle partall blant de n første fibonacci-tall. (define (even-fibs n) (define (next k) ; Merk at next gir en rekursiv prosess (if (> k n) ; Basis: Vi har talt oss frem til og med n te fibonaccitall, så ; returner den tomme listen (let ((f (fib k))) ; Allment: Behandle k te fibonaccitall. (if (even? f) ; Skal det være med, så (cons f (next (+ k 1))) ; legger vi det inn foran de eventuelle etterfølgende, (next (+ k 1)))))) ; og hvis ikke, tar vi bare med de eventuelle etterfølgende. (next 0)) Vi kan fremstille de to prosessene parallelt slik: sum-odd-squares even-fibs regn opp: blader regn opp: heltall filtrér: odde avbild: fibonér avbild: kvadrér filtrér: partall akkumulér: +, 0 akkumulér: cons, () Bytter vi rekkefølgen mellom filtrering og avbildning i den en eller den andre kolonnen, blir parallellen fullstendig. Men for å generalisere, kan vi ikke ta utgangspunkt i prosedyrer der delprosessene er vevd sammen i én og samme prosess. I stedet skiller vi ut de enkelt delprosessene og plasserer dem i en sekvens av prosesser. Det vi gjør får preg av signalbehandling, der vi sender signaler gjennom filtre, forsterkere, omformere og akkumulatorer. Oppregning (enumerering) i en fortløpende flat liste av verdier (flat = ikke et tre) (define (enumerate-interval a b) ; lag en liste med tallene fra og med a til og med b. (if (> a b) (cons a (enumerate-interval (+ a 1) b)))) (define (enum-tree tree) ; lag en liste med alle elementene i tree. (cond ((null? tree) nil) ((not (pair? tree)) (list tree)) (else (append (enum-tree (car tree)) ; skjøt sammen enumereringen av venstre subtre (enum-tree (cdr tree)))))) ; og enumereringen av høyre subtre Merk at vi her konverterer fra tre til liste, og derfor bruker append Vi skjøter sammen enumereringen av treet i car-delen og av treet i cdr-delen i løpende node. mens vi i scale-tree (6 sider tidligere) mapper fra et tre til et annet, og derfor bruker cons. Vi rekonstruerer strukturen til treet, men gir bladene nytt innhold
6 Akkumulering kombinering av elementene i en liste til én verdi f.eks. en liste av tall til en sum (define (accumulate combine init-val seq) ; combine må være en binær (to-arguments) prosedyre (if (null? seq) init-val (combine (car seq) (accumulate combine init-val (cdr seq))))) (accumulate + 0 (enum-interval 1 6)) 21 (accumulate * 1 (enum-interval 1 6)) 720 (accumulate sqrt 1 (enum-interval 1 6)) RT-feil: sqrt tar kun ett arg. (accumulate + 0 ( )) (+ 1 (accumulate + 0 (2 3 4))) (+ 1 (+ 2 (accumulate + 0 (3 4)))) (+ 1 (+ 2 (+ 3 (accumulate + 0 (4))))) (+ 1 (+ 2 (+ 3 (+ 4 (accumulate + 0 ()))))) (+ 1 (+ 2 (+ 3 (+ 4 0)))) (+ 1 (+ 2 (+ 3 4))) (+ 1 (+ 2 7)) (+ 1 9) 10 Redefinering av sum-odd-squares og even-fibs (fra 3. forelesning) som operasjonssekvenser: (define (sum-odd-squares tree) (accumulate + 0 (map square (filter odd? (enum-tree tree))))) (define (even-fibs n) (accumulate cons (filter even? (map fib (enum-interval 0 n))))) Legg merke til at i det siste eksemplet, der kombinatoren er cons, er returverdien selv en liste. (Dette gjør eksemplet (som er fra SICP) litt tullete, siden vi alt har en liste, returnert fra filter, men det viser parallellen mellom de to operasjonssekvensene.) Sammenhengen mellom bruk av cons og append og nedtelling og opptelling (define (enum n) (if (= n 0) (cons n (enum (- n 1))))) (enum 5) ( ) ; SYNKENDE (define (enum n) (if (= n 0) (append (enum (- n 1)) (list n)))) (enum 5) ( ) ; STIGENDE (define (enum a b) (if (> a b) (cons a (enum (+ a 1) b)))) (enum 1 5) ( ) ; STIGENDE (define (enum a b) (if (> a b) (append (list a) (enum (+ a 1) b)))) (enum 1 5) ( ) ; STIGENDE (define (enum a b) (if (> a b) (append (enum (+ a 1) b) (list a)))) (enum 1 5) ( ) ; SYNKENDE Nøstet avbildning Problem: Gitt et heltall n, finn alle ordnede par (i, j) for 1 i < j n, alle par (i, j) mellom 1 og n slik at i < j slik at summen i + j er et primtall! Sluttresultatet skal være en liste med tripler på formen (i j i+j). Eks: (2 5 7) j i output Dette kan gjøres i en nestet løkke: 2 1 (((1 2 3)) - for hver j fra 2 til n, ((2 3 5))) - for hver i fra 1 til j 1, ((1 4 5) (3 4 7)) - hvis i + j er et primtall ((2 5 7)) - lag en trippel ((1 6 7) (5 6 11))) Vi kunne også løpt gjennom i'ene i i j output den yttre og j'ene i den indre løkka: (((1 2 3) (1 4 5) (1 6 7)) - for hver i fra 1 til n - 1, ((2 3 5) (2 5 7))) - for hver j fra i + 1 til n, ((3 4 7)) - hvis i + j er et primtall () - lag en trippel. 5 6 ((5 6 11)))
7 La oss i første omgang se hvordan dette kan løses ved å gå innenfra og utover (bottom up): (a) Innerst lager vi en trippel fra en to-elements liste: (define (make-pair-sum pair) ; NB! pair er her rent formelt en liste med to elementer (list (car pair) ; parets første tall (cadr pair) ; parets andre tall (+ (car pair) (cadr pair)))) ; summen av parets to tall (b) Så lager vi alle triplene for primtallsparene for fixert j og for i = 1 j - 1: (define (make-prime-pair-segment i j) ; tell opp i fra 1 til j og cons hvert nytt par (cond ((= i j) ) ((prime? (+ i j)) ; summen er et primtall, så (cons (make-pair-sum (list i j)) ; cons denne triplen (make-prime-pair-segment (+ i 1) j))) ; på de etterfølgende (else (make-prime-pair-segment (+ i 1) j)))) (c) Ytterst lager vi alle triplene for alle j fra 2 til n: (define (make-prime-pair-list j) ; tell ned j fra n til 2 og append hvert nytt segment (if (< j 2) (append (make-prime-pair-list (- j 1)) ; Lag første del av listen, og (make-prime-pair-segment 1 j)))) ; skjøt så dette segmentet til listen Ovenstående gir et greit, men spesifikt, program som løser et spesifikt problemet. At løsningen er spesifikk er et resultata av at de ulike operasjonen er vevd sammen, bl.a. ved at vi enumererer, tester og lager trippellisten i en og samme operasjon i make-prime-pair-segment. Det vi er interessert i her, er å se om problemet kan løses i en sekvens av uavhengig standardoperasjoner på lister, her: enumerering, filtrering, mapping og akkumulering. (a) Trippel-konstruktoren blir den samme som i bottom-up-løsningen: (define (make-pair-sum pair) (list (car pair) (cadr pair) (+ (car pair) (cadr pair)))) (b) Dernest trenger vi et predikat for primtallspar: (define (prime-sum? pair) (prime? (+ (car pair) (cadr pair)))) I SICP, både i den løpende teksten og i øvelsene, angis ulike algoritmer for primtallstesting, men ingen er enkle nok til å vises her Generering av de ordnede parene (c) Lag listen med j'ene ved å enumerere fra 2 til n: (enumerate-interval 2 n) (2 3 n) (d) Lag listen med i'ene ved å enumerere fra 1 til j 1: (enumerate-interval 1 ( - j 1)) (1 2 j-1) (e) Lag parene for én j ved å mappe fra (d) til liste med par (i j) i en kontekst der j er kjent: (map (lambda (i) (list i j)) (enumerate-interval 1 ( - j 1))) ((5 1) (5 2) ) (f) Lag parene for alle j'ene ved å mappe fra (c) til (e): (map (lambda (j) (map (lambda (i) (list i j)) ; (e) (enumerate-interval 1 ( - j 1)))) ; (d) (enumerate-interval 2 n)) ; (c) (((1 2)) ((1 3) (2 3)) ((1 4) (2 4) (3 4))...) Vi fikk en liste med lister av par (((1 2)) ((1 3) (2 3)) ((1 4) (2 4) (3 4))...) men ønsker oss en flat liste av par ((1 2) (1 3) (2 3) (1 4) (2 4) (3 4)...) (g) Akkumuler med append, for å skjøte sammen og løfte opp listene på nivå 2 til topnivålisten: (s. 197) (accumulate append (map (lambda (j) ; (f) (map (lambda (i) (list i j)) ; (e) (enumerate-interval 1 ( - j 1)))) ; (d) (enumerate-interval 2 n))) ; (c) Denne listeutflatingen er såpass vanlig at vi lager en egen rutine flatmap for denne: (define (flatmap proc seq) (accumulate append (map proc seq)))
8 Cloue'et med flatmap er at append tar to lister og (slik + tar to tall og at append faktisk tar én eller flere lister, er en annen sak returnerer én returnerer ett,) slik at vi, når vi suksessivt legger neste liste til den akkumulerte lista, ender opp med én liste. (accumulate append '((a b c) (d e f) (g h i))) (append (a b c) (accumulate append '((d e f) (g h i)))) (append (a b c) (append (d e f) (accumulate append '((g h i))))) (append (a b c) (append (d e f) (append (g h i) (accumulate append )))) (append (a b c) (append (d e f) (g h i))) (append (a b c) (d e f g h i)) (a b c d e f g h i) (h) Med alt dette på plass får vi følgende løsning: (define (prime-sum-pairs n) (map make-pair-sum ; (a) (filter prime-sum? ; (b) (flatmap (lambda (j) ; (f-g) (map (lambda (i) (list i j)) ; (e) (enumerate-interval 1 ( - j 1)))) ; (d) (enumerate-interval 2 n))))) ; (c)
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
DetaljerINF2810: 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
DetaljerHø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
DetaljerINF2810: 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
DetaljerGjennomgå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
DetaljerINF2810: 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
DetaljerUNIVERSITETET 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
DetaljerEksamen 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
DetaljerINF2810: 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
DetaljerINF2810: 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
DetaljerINF2810: 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
DetaljerINF2810: 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
DetaljerINF2810: 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.
DetaljerINF2810: 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
DetaljerINF2810: 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
DetaljerINF2810: 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
DetaljerRekursjon 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
DetaljerSide 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 å
DetaljerUNIVERSITETET 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
DetaljerINF2810: 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
DetaljerMemoisering, 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
DetaljerMemoisering, 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
DetaljerOppgave 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
DetaljerINF2810: 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(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)
DetaljerINF2810: Funksjonell Programmering. Strømmer
INF2810: Funksjonell Programmering Strømmer Stephan Oepen & Erik Velldal Universitetet i Oslo 12. april 2013 Tema 2 Forrige uke Litt mer i dybden om køer Eksperiment: live-programmering Tabeller som hierarkiske
DetaljerINF2810: Funksjonell Programmering. Strømmer
INF2810: Funksjonell Programmering Strømmer Stephan Oepen & Erik Velldal Universitetet i Oslo 12. april 2013 Tema 2 Forrige uke Litt mer i dybden om køer Eksperiment: live-programmering Tabeller som hierarkiske
DetaljerINF2810: 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
DetaljerINF2810: 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
DetaljerINF2810: 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
DetaljerINF2810: 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
DetaljerINF2810: 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
DetaljerINF2810: 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
DetaljerINF2810: 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,
DetaljerINF2810: 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
DetaljerVi 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
DetaljerINF2810: Funksjonell Programmering. Mer om strømmer
INF2810: Funksjonell Programmering Mer om strømmer Stephan Oepen & Erik Velldal Universitetet i Oslo 19. april 2013 Tema 2 Forrige uke Repetisjon: parallelitet Noe helt nytt: strømmer Noe quizzaktivitet
DetaljerUNIVERSITETET 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:
DetaljerINF2810: Funksjonell Programmering. Mer om strømmer
INF2810: Funksjonell Programmering Mer om strømmer Stephan Oepen & Erik Velldal Universitetet i Oslo 19. april 2013 Tema 2 Forrige uke Repetisjon: parallelitet Noe helt nytt: strømmer Noe quizzaktivitet
DetaljerINF2810: 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
DetaljerINF2810: 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
DetaljerInnlevering 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
DetaljerUNIVERSITETET 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)
DetaljerINF2810: 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
DetaljerINF2810: 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
DetaljerINF2810: 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
DetaljerINF2810: 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
DetaljerEksamen 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
DetaljerINF2810: 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
DetaljerINF2810: 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
DetaljerINF2810: 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
DetaljerINF2810: 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
DetaljerINF2810: 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
DetaljerINF2810: 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
DetaljerLø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
DetaljerINF2810: 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:
DetaljerINF2810: 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:
DetaljerDefinisjon 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
DetaljerUNIVERSITETET 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.
DetaljerINF2810: 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
DetaljerINF2810: 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
DetaljerLisp 2: Lister og funksjoner
Eirik Alderslyst Nygaard Øystein Ingmar Skartsæterhagen Programvareverkstedet 11. mars 2010 (Lister) (Par) (Listeoperasjoner) (Assosiasjonslister)... lists are the heart of Lisp... Guy L. Steele Jr. (Par)
DetaljerINF2810: 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
DetaljerBinæ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
DetaljerINF2810: 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
DetaljerINF2810: Funksjonell Programmering. Utsatt evaluering og strømmer
INF2810: Funksjonell Programmering Utsatt evaluering og strømmer Stephan oepen Universitetet i Oslo 6. april 2017 Tema 2 Forrige gang Ny datastruktur, ny teknikk: Strømmer Utsatt evaluering I dag Uendelige
DetaljerINF2810: 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
DetaljerAppendiks A Kontinuasjoner
Appendiks A Kontinuasjoner Fra R5RS: "Whenever a Scheme expression is evaluated there is a continuation wanting the result of the expression." Eller med andre ord: En kontinuasjon i et program under utførelse
DetaljerDefinisjon: 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
DetaljerEksamen iin115, 14. mai 1998 Side 2 Oppgave 1 15 % Du skal skrive en prosedyre lagalle som i en global character array S(1:n) genererer alle sekvenser
UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i IN 115 Algoritmer og datastrukturer Eksamensdag: 14. mai 1998 Tid for eksamen: 9.00 15.00 Oppgavesettet er på 8 sider. Vedlegg:
DetaljerIN2040: 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:
DetaljerLøsnings forslag i java In115, Våren 1996
Løsnings forslag i java In115, Våren 1996 Oppgave 1a For å kunne kjøre Warshall-algoritmen, må man ha grafen på nabomatriseform, altså en boolsk matrise B, slik at B[i][j]=true hvis det går en kant fra
DetaljerINF2220: 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
DetaljerBinæ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
DetaljerINF2810: 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
DetaljerEksamen i IN 110, 18. mai 1993 Side 2 Del 1 (15%) Vi skal se på prioritetskøer av heltall, der vi hele tiden er interessert i å få ut den minste verdi
UNIVERSITETET I OSLO Det matematisk-naturvitenskapelige fakultet Eksamen i Eksamensdag: 18. mai 1993 Tid for eksamen: 9.00 15.00 Oppgavesettet er på 7 sider. Vedlegg: Tillatte hjelpemidler: IN 110 Algoritmer
DetaljerRekursjon. Binærsøk. Hanois tårn.
Rekursjon Binærsøk. Hanois tårn. Hvorfor sortering (og søking) er viktig i programmering «orden» i dataene vi blir fort lei av å lete poleksempel internett «alt» er søking og sortering alternativer til
DetaljerINF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer
INF2810: Funksjonell Programmering Lister og høyereordens prosedyrer Stephan Oepen Universitetet i Oslo 2. februar 2016 Agenda 2 Forrige uke Substitusjonsmodellen og evalueringsstrategier Blokkstruktur
DetaljerEKSAMEN med løsningsforslag
EKSAMEN med løsningsforslag Emnekode: ITF20006 Emne: Algoritmer og datastrukturer Dato: Eksamenstid: 20. mai 2009 kl 09.00 til kl 13.00 Hjelpemidler: 8 A4-sider (4 ark) med egne notater Kalkulator Faglærer:
DetaljerE 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
DetaljerKONTINUASJONSEKSAMEN
Høgskolen i Gjøvik Avdeling for Teknologi KONTINUASJONSEKSAMEN FAGNAVN: FAGNUMMER: Algoritmiske metoder I L 189 A EKSAMENSDATO: 13. august 2001 KLASSE: 99HINDA / 99HINDB / 99HINEA / 00HDESY ( 2DA / 2DB
DetaljerFra 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
DetaljerMAT1030 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.
DetaljerNorsk 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.
DetaljerNorsk informatikkolympiade runde
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.
DetaljerBinæ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(?):
DetaljerMAT1030 Diskret matematikk
MAT30 Diskret matematikk Plenumsregning 6: Ukeoppgaver fra kapittel Roger Antonsen Matematisk Institutt, Universitetet i Oslo. februar 008 Oppgave. Skriv følgende mengder på listeform. (a) Mengden av alle
Detaljeralternativer til sortering og søking binære trær søketrær Ikke-rekursiv algoritme som løser Hanois tårn med n plater
Dagens temaer Sortering: 4 metoder Hvorfor sortering (og søking) er viktig i programmering Sortering når objektene som skal sorteres er i et array 1. Sorterering ved bruk av binærtre som «mellomlager»
DetaljerRekursiv programmering
Rekursiv programmering Babushka-dukker En russisk Babushkadukke er en sekvens av like dukker inne i hverandre, som kan åpnes Hver gang en dukke åpnes er det en mindre utgave av dukken inni, inntil man
DetaljerRekursiv programmering
Rekursiv programmering Babushka-dukker En russisk Babushkadukke er en sekvens av like dukker inne i hverandre, som kan åpnes Hver gang en dukke åpnes er det en mindre utgave av dukken inni, inntil man
DetaljerTDT4165 PROGRAMMING LANGUAGES. Exercise 02 Togvogn-skifting
TDT4165 PROGRAMMING LANGUAGES Fall 2012 Exercise 02 Togvogn-skifting Problembeskrivelse Du er sjef for å skifte vognene til et tog. Vi antar at hver vogn selv har en motor og at toget ikke har noe lokomotiv.
DetaljerMAT1030 Diskret matematikk
MAT1030 Diskret matematikk Plenumsregning 6: Ukeoppgaver fra kapittel 5 Roger Antonsen Matematisk Institutt, Universitetet i Oslo 21. februar 2008 Oppgave 5.1 Skriv følgende mengder på listeform. (a) Mengden
DetaljerINF2810: 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:
DetaljerNorsk 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.
DetaljerNotat 2, ST Sammensatte uttrykk. 27. januar 2006
Notat 2, ST1301 27. januar 2006 1 Sammensatte uttrykk Vi har sett at funksjoner ikke trenger å bestå av annet enn ett enkeltuttrykk som angir hva funksjonen skal returnere uttrykkt ved de variable funksjonen
DetaljerPG4200 Algoritmer og datastrukturer Forelesning 7
PG4200 Algoritmer og datastrukturer Forelesning 7 Lars Sydnes, NITH 19. mars 2014 I. TERMINOLOGI FOR TRÆR TRÆR Lister: Lineære Trær: Hierarkiske Modell / Språk: Bestanddeler: Noder, forbindelser. Forbindelse
DetaljerMemoisering. I de følgende memoiseringeksemplene brukes tabeller, og vi tar derfor først en repetisjon av dette.
Memoisering I de følgende memoiseringeksemplene brukes tabeller, og vi tar derfor først en repetisjon av dette. Vi definere en allmenn tabelltype ved en prosedyre med - tabellen som en lokal tilstandsvariabel,
DetaljerDynamisk programmering
Dynamisk programmering Metoden ble formalisert av Richard Bellmann (RAND Corporation) på 50-tallet. Programmering i betydningen planlegge, ta beslutninger. (Har ikke noe med kode eller å skrive kode å
DetaljerINF2220: Forelesning 2. Balanserte søketrær Rød-svarte trær (kapittel12.2) B-trær (kapittel 4.7)
INF2220: Forelesning 2 Balanserte søketrær Rød-svarte trær (kapittel12.2) B-trær (kapittel 4.7) REPETISJON: BINÆRE SØKETRÆR 2 Binære søketrær 8 4 12 2 7 9 15 6 11 13 16 For enhver node i et binært søketre
DetaljerINF2220: Forelesning 2
INF2220: Forelesning 2 Balanserte søketrær Rød-svarte trær (kapittel12.2) B-trær (kapittel 4.7) REPETISJON: BINÆRE SØKETRÆR 2 Binære søketrær 8 4 12 2 7 9 15 6 11 13 16 For enhver node i et binært søketre
Detaljer