UNIVERSITETET I OSLO

Like dokumenter
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.

UNIVERSITETET I OSLO

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

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

Eksamen i SLI230, vår 2003.

INF2810: Funksjonell Programmering. Kommentarer til prøveeksamen

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering

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

Høyere-ordens prosedyrer

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering. Dataabstraksjon og Trerekursjon

INF2810: Funksjonell Programmering. Eksamensforberedelser

Memoisering, utsatt evaluering og strømmer

Memoisering, utsatt evaluering og strømmer

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

INF2810: Funksjonell Programmering. Strømmer og utsatt evaluering

INF2810: Funksjonell Programmering. Strømmer

INF2810: Funksjonell Programmering. Strømmer

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

INF2810: Funksjonell Programmering. Trær og mengder

INF2810: Funksjonell Programmering. Trær og mengder

INF2810: Funksjonell Programmering. Strømmer og utsatt evaluering

INF2810: Funksjonell Programmering. Mer om strømmer

INF2810: Funksjonell Programmering. Mer om strømmer

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

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

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

INF2810: Funksjonell Programmering. Trær og mengder

UNIVERSITETET I OSLO

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

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

Oppgave 1 Minimum edit distance

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

Innlevering 2a i INF2810, vår 2017

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

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

UNIVERSITETET I OSLO

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer

Appendiks A Kontinuasjoner

UNIVERSITETET I OSLO

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

UNIVERSITETET I OSLO

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

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

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

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF2810: Funksjonell Programmering. Huffman-koding

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

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer

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

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Innlevering 2b i INF2810, vår 2017

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF2810: Funksjonell Programmering. Huffman-koding

INF2810: Funksjonell Programmering. En metasirkulær evaluator

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

Lisp 2: Lister og funksjoner

UNIVERSITETET I OSLO

INF2810: Funksjonell Programmering. En Scheme-evaluator i Scheme

UNIVERSITETET I OSLO

INF2810: Funksjonell Programmering. Utsatt evaluering og strømmer

INF2810: Funksjonell Programmering. En metasirkulær evaluator

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

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

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

UNIVERSITETET I OSLO

INF2810: Funksjonell Programmering. Muterbare data

Eksamen i SLI 5 høsten 1993

Transkript:

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 Kontroller at oppgavesettet er komplett før du begynner å svare på spørsmålene. Innledning All tallregning i oppgaven utføres på heltall fra og med 0. Tallmengden er definert ved - minsteallet zero, - predikatet zero? som tar et tall og returnerer #t eller #f avh. av om dette er lik zero eller ikke, - prosedyren succ som tar et tall og returnerer dettes etterfølger, og - prosedyren pred som tar et tall og returnerer dettes forgjenger, eller zero, hvis tallet ikke har noen forgjenger. I tillegg skal vi definere prosedyrene add, sub, mul og div. - add tar to heltall og returnerer summen av disse - sub tar to heltall og returnerer differansen mellom disse - mul tar to heltall og returnerer produktete av disse. - div tar to heltall a og b som argumenter og returnerer antall hele ganger a kan deles på b. Eks: (div 15 4) ==> 3, (div 15 5) ==> 3, (div 15 6) ==> 2. NB! Inntil videre skal du ikke bruke andre prosedyrer enn zero?, succ, pred, add, sub, mul og div, samt de prosedyrene du selv definerer underveis.

Side 2 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. b. Skriv g, uten å bruke f, slik at (((g a) b) c) returnerer summen av a, b og c. 1.2. Prosedyren rem tar to heltall a og b som argumenter og returnerer resten etter at a er dividert på b. Eks: (rem 15 4) ==> 3 (rem 15 5) ==> 0. Skriv prosedyren rem. 1.3. Semipredikatet congruent tar tre heltall a, b og m. Hvis delingen av a på m gir samme rest som delingen av b på m, returneres denne resten, og hvis ikke, returneres #f. Eks: (congruent 10 27 4) ==> #f (congruent 11 27 4) ==> 3. Skriv prosedyren congruent (og husk at du ikke har noen sammenligningspredikat for tall). Oppgave 2. Rekursjon I oppgave 2.1 2.4. kan du bare bruke verdien zero og prosedyrene zero?, succ, pred, add og sub. 2.1. Skriv prosedyren add uten bruk av lokal hjelpeprosedyre slik at den gir en iterativ prosess. 2.2. Skriv prosedyren add slik at den gir en rekursiv prosess. 2.3. Skriv prosedyren sub slik at den gir en rekursiv prosess. 2.4. Skriv prosedyren mul slik at den gir en rekursiv prosess. 2.5. Skriv prosedyren div ved hjelp av en lokal prosedyre slik at den gir en rekursiv prosess. Prosedyren skal sjekk for divisjon på zero, som ikke er tillat, før den lokal prosedyren eventuelt kalles. NB! Herfra kan du bruke Scheme sitt sammenligningspredikat = i tillegg til de prosedyrene som er nevnt over.

Side 3 2.6. Pascals trekant består av For å illustrere hva vi er ute etter tallrekker av økende lengde, slik: representerer vi den slik. r \c 1 2 3 4 5 6... 1 1 1 1 1 2 1 1 1 2 1 3 1 2 1 1 3 3 1 4 1 3 3 1 1 4 6 4 1 5 1 4 6 4 1 1 5 10 10 5 1 6 1 5 10 10 5 1 1 6 15 20 15 6 1 7 1 6 15 20 15 6 1........ La P(r, c) være tallet i kolonne c i rad r i Pascals trekant. Da har vi og P(r, 1) = P(r, r) = 1, for alle r, P(r, c) = P(r 1, c 1) + P(r 1, c), for 1 < c < r. Prosedyre pascal tar en kolonneindeks og en radindeks og returnerer det tilsvarende tallet i Pascals trekant. Skriv prosedyre pascal. Oppgave 3. Par og lister I denne oppgaven kan du, i tillegg til de tallprosedyrene som er nevnt i innledningen, bruke følgende prosedyrer for par og lister, og ingen andre: (cons a b) paret med a som første og b som andre element. (car pair) første element i paret pair. (cdr pair) andre element i paret pair. (cxr L) X er kombinasjonen av to, tre eller fire a-er og d-er, tilsvarende sammensetninger av car og cdr. F.eks. evaluerer (caddr L) til det samme som (car (cdr (cdr L))). (null? x) #t eller #f avhengig av om x er den tomme listen eller ikke. (reverse L) listen med elementene i L i omvendt orden.

Side 4 Vi lar Pascals trekant opp til et gitt antall rader n være representert ved en liste av lister (define pr '((1) (1 1) (1 2 1) (1 3 3 1) (1 4 6 4 1)... (1 n 1... n 1 1))) 3.1. Bruk selektorene car, cdr og kombinasjoner av disse for å hente ut de 6 første tallene i pr. 3.2. Prosedyren list-tail tar en liste L og en indeks k som argumenter og returnerer listen fra og med element nummer k i L, talt fra zero, eller en feilmelding, hvis listen har færre enn k elementer. Eks: (list-tail '(a b c d e f g h i) 3) ==> (d e f g h i) Skriv list-tail. 3.3. Vi vil ha en ny versjon av prosedyren pascal (se oppgave 2.6.) som operere på listerepresentasjonen. Den må da få listen som første argument, foran de to indeksene. Bruk list-tail til å skrive den nye versjonen av prosedyren pascal. 3.4. Prosedyren next-pascal-row tar en rad i Pascals trekant som argument og returnerer raden under denne i trekanten (se innledningen til oppgave 2.6). Eks: (next-pascal-row '(1 3 3 1)) ==> (1 4 6 4 1) Skriv prosedyren next-pascal-row. 3.5. Prosedyren make-pascal-triangle tar et heltall n som argument og returnerer listen med de n første radene i Pascals trekant. Skriv prosedyren make-pascal-triangle. Oppgave 4. Strømmer I denne oppgaven kan du, i tillegg til de tallprosedyrene som er nevnt i innledningen, og de par- og listeprosedyrne som er nevnt i oppgave 3, bruke følgende prosedyrer for strømmer, og ingen andre: (cons-stream a b) paret av a og løftet om en fremtidig evaluering av b. (stream-car pair) (stream-cdr pair) første element i strøm-paret pair. andre element i strøm-paret pair, etter av løftet om evalueringen av dette har blitt avtvunget.

Side 5 4.1. Strømprosedyren gen-stream tar en unær prosedyre proc og en verdi prev som første og andre argument og returnerer strømmen der hvert ledd er resultatet av anvendelsen av proc på det foregående leddet, i prosedyren gitt ved prev, slik at f.eks. (stream->list (gen-stream (lambda (x) (+ x 2)) 1) 7) ==> (1 3 5 7 9 11 13) Her er initialverdien til pred = 1 og hvert element deretter = elementets forgjenger + 2. Skriv strømprosedyren gen-stream. 4.2. Vi skal nå definere strømmen av radene i pascals trekant, pascal-rows-stream, slik at f.eks. (stream->list pascal-row-stream 5) ==> ((1) (1 1) (1 2 1) (1 3 3 1) (1 4 6 4 1)) Skriv en prosedyre make-pascal-rows-stream som returnerer strømmen av rader i Pascals trekant. (Siden de enkelte radene skal være lister, kan du ha nytte av oppgave 3.) 4.3.Vi skal nå definere strømmen av tallene i pascals trekant, pascal-stream, slik at f.eks. (stream->list pascal-stream 15) ==> (1 1 1 1 2 1 1 3 3 1 1 4 6 4 1) Prosedyren pascal-stream-ref tar strømmen med pascal-tallene, ps, radnummeret r og kolonnenummeret c som argumenter og returnerer P(r, c) (se oppgave 2.6) fra ps. Her kan det være nyttig med en lokal prosedyre som teller rader og kolonner. Merk at radlengde = radnummer. Skriv prosedyren pascal-stream-ref. 4.4. Prosedyren make-pascal-stream lager strømmen av pascal-tallene. Til dette trenger den et rad- og et kolonnenummer som argumenter, og dessuten strømmen summands som ligger suksessivt lenger og lenger etter det løpende leddet i pascalstrømmen, slik at løpende pascal-tall = (+ (stream-car summands) (stream-car (stream-cdr summands))). For å få oppdatert summands må vi forholde oss til tre tilfeller: - 1. vi er i første kolonne, - 2. vi er i siste kolonne, eller - 3. vi er mellom ytterkolonnene. Skriv prosedyren make-pascal-stream. 4.5. Definer strømmen med pascal-tall, pascal-stream, vha. make-pascal-stream (her trengs det mer enn ett initielt ledd). Du kan bruke make-pascal-stream selv om du ikke har definert den.