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

Størrelse: px
Begynne med side:

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

Transkript

1 INF2810: Funksjonell programmering: Mer om Scheme. Rekursjon og iterasjon. Stephan Oepen & Erik Velldal Universitetet i Oslo 25. januar, 2013

2 På blokka 2 Forrige uke Introduksjon og oversikt Funksjonell programmering Litt om Scheme I dag Mer om Scheme Mer om egen-definerte prosedyrer Substitusjonsmodellen Blokkstruktur Predikater og kondisjonale uttrykk Rekursive prosedyrer Rekursive og iterative prosesser

3 Oppsummering: Scheme på én slide 3 Prosedyrekall i Scheme = liste. Første listeelement = prosedyren. Eksempler? ( ) 25 Resten = argumentene. Først evalueres alle argumentene, så kalles prosedyren på verdien av disse. Eneste unntak fra regelen er noen få såkalte special forms. For å binde et symbol til en verdi (f.eks en prosedyre) brukes define.? (* 10 ( )) 1000? (define bar 420)? (define (foo x) (/ x 10))? (foo bar) 42

4 Predikater og kondisjonale uttrykk 4 Eksempler? (define foo 42)? (even? foo) #t? (zero? foo) #f? (>= foo 42) #t? (and (< 3 4) (not (zero? 42))) #t? (or (>= foo 10) (negative? foo)) #t Predikater er prosedyrer eller uttrykk som returnerer sant / usant (#t / #f). F.eks zero?, even?, >, =, etc. Husk at alt unntatt #f teller som sant. Med logiske predikater som and, or og not kan vi bygge sammensatte predikater. Sammen med kondisjonale uttrykk som f.eks if og cond kan vi bruke predikater til å kontrollere flyten i et program.

5 Predikater og kondisjonale uttrykk (forst.) 5 Eksempler? (define foo 42) Generell form? (define foo 42)? (if (number? foo) "number" "something else") "number"? (cond ((< foo 3)) "less") ((> foo 3) "greater") (else "equal")) "greater" (if predikat utfall-hvis-sant utfall-hvis-usant ) (cond ( predikat 1 utfall 1 ) ( predikat 2 utfall 2 ) ( predikat n utfall n ) (else utfall ))

6 Predikater og kondisjonale uttrykk (forst.) 6 Eksempler på special forms, ikke vanlige prosedyrer. Prosedyrer: først evalueres alle argumentene, så anvendes prosedyren. Special forms: styrer selv om og når argumentene evalueres. if og cond; det er kun uttrykkene som angir utfallet for den første testen som slår til som evalueres. or og and; evaluerer uttrykkene én av gangen fra venstre til høyre: or: hvis et uttrykk evalueres til en sann verdi returneres denne, ingen flere uttrykk evalueres. and: hvis et uttrykk evalueres til en usann verdi returneres denne, ingen flere uttrykk evalueres. Ellers returneres verdien av det siste uttrykket.

7 Vi skal se nærmere på prosedyre-definisjoner 7 Ting vi skal snakke mer om: Substitusjonsmodellen. Variabler, verdibinding og rekkevidde (scope). Formelle parametere og frie og bundne variabler i prosedyrekroppen. Sammensatte funksjoner. Blokkstruktur. Rekursjon og iterasjon. Prosedyrer vs. prosesser.

8 Substitusjonsmodellen 8 Egendefinerte prosedyrer evalueres på samme måte som beskrevet tidligere. Vi kan tenkte oss at funksjonsuttrykk skrives om på følgende måte: Hele uttrykket erstattes av prosedyrekroppen i definisjonen. Argumentnavnene i definisjonen erstattes av verdiene til uttrykkene i argumentposisjon. Dette kalles substitusjonsmodellen. (Men dette er kun en modell; senere skal vi se på en annen modell som gir et mer presist bilde.) Eksempel? (define (snitt x y) (/ (+ x y) 2)))? (snitt (snitt 10 20) (snitt 10 30)) (snitt (/ ( ) 2) (snitt 10 30)) (snitt 15 (snitt 10 30)) (snitt 15 (/ ( ) 2)) (snitt 15 20) (/ ( ) 2) 17.5

9 Formelle parametere, og frie / bundne variabler 9 (define (snitt x y) (/ (+ x y) 2)) Så lenge vi er konsekvente spiller det ingen rolle hvilke navn vi bruker på de formelle parameterene (x og y). Men vi bør ikke bruke navn som allerede er bundet til f.eks prosedyrer. Vi vil da overskygge prosedyrebindingen, og få problemer dersom vi ønsker å kalle prosedyren. Mer generelt kan vi snakke om to typer variabler: frie og bundne. Parameterene er eksempler på bundne variabler. Rekkevidden (scope) for bindingen er kroppen til prosedyren. I kroppen til snitt kan symbolene / og + sees som frie variabler. Deres bindinger er etablert utenfor denne leksikalske konteksten.

10 Sammensatte prosedyrer 10 Eksempel? (define (avslag p sum) (* (/ sum 100) p))? (avslag ) 150? (define (salgspris p pris) (- pris (avslag p pris)))? (salgspris ) 450 Viktig perspektiv: Å definere prosedyrer kan sees som en form for abstraksjon. Mange fordeler. I salgspris bryr vi oss ikke om hvordan avslag er implementert, så lenge den gir oss forventet returverdi. Ønsker vi å endre måten vi regner ut avslag på holder det å gjøre det i definisjonen; alle andre steder vi måtte bruke avslag kan stå uendret. Kan teste avslag isolert. Kortere kode gjennom gjenbruk.

11 Interne definisjoner og blokkuttrykk 11 Men la oss nå tenke oss at vi ikke ønsker å bruke avslag i andre prosedyrer enn salgspris. Vi kan da definere prosedyren avslag lokalt og internt i definisjonen til salgspris; vi sier at de danner en blokk:? (define (salgspris p pris) (define (avslag) (* (/ pris 100) p)) (- pris (avslag)))? (salgspris ) 450 Her har vi samtidig forenklet avslag slik at den er helt uten parametere. Variablene pris og p er nå frie i definisjonen av avslag: Tar sin verdi fra bindingene i omsluttende definisjon av salgspris. Et eksempel på det som kalles lexical scoping.

12 Føler du at det er noe som mangler? 12 Koding involverer gjerne en eller annen form for løkke. I imperative/prosedyrale språk uttrykkes dette med konstruksjoner som while, for, do, until, repeat, osv. Iterativ oppdatering av lokale tilstandsvariabler. I fravær av muterbare variabler uttrykkes løkker på en annen måte i funksjonell programmering: Rekursive prosedyrekall. Løkker realisert som funksjonelle transformasjoner, ikke basert på side-effekter.

13 Rekursjon En rekursiv prosedyre anvender seg selv i sin egen definisjon. Klassisk eksempel: fakultetsfunksjonen. Kan se sirkulært ut, men er veldefinert så lenge vi har et eller flere basistilfeller hvor vi terminerer rekursjonen. Til sammenlikning: ikke-funksjonell kode uten rekursjon, med whileløkke og endring av lokale tilstandsvariabler. n! = { 1 hvis n = 0 n (n 1)! hvis n > 0 (define (fac n) (if (= n 0) 1 (* n (fac (- n 1))))) def fac(x): f = 1 while (x > 0): f = f * x x = x - 1 return f 13

14 Rekursjon (forts.) 14 Rekursjon er mest naturlig når løsningen til et problem baseres på løsningene til reduserte instanser av samme problem. Vi reduserer mot basistilfellet (base case) Nøyaktig hva vi mener med å redusere kommer an på problemet vi jobber med.? (define (fac n) (if (= n 0) 1 (* n (fac (- n 1)))))? (fac 2) 2? (fac 3) 6? (fac 4) 24? (fac 5) 120

15 Prosedyre vs prosess 15 Hver gang fac kaller seg selv har vi også et kall på * som venter på returverdien. Vi får en kjede av ventende kall som fortsetter å vokse helt til vi når basistilfellet, n = 0. Genererer en rekursiv prosess. (define (fac n) (if (= n 0) 1 (* n (fac (- n 1))))) Jo dypere rekursjon jo mer stakkminne brukes for å utføre prosessen. Prosessens tids- og plassbehov vokser direkte proporsjonalt med n: Eksempel på en lineær rekursiv prosess. Vekstrate (order of growth) = O(n).

16 Rekursiv prosess 16 Vi kan bruke substitusjonsmodellen til omskrive et kall på fac for å visualisere hvordan den rekursive prosessen utvikler seg:? (fac 7) (* 7 (fac 6)) (* 7 (* 6 (fac 5))) (* 7 (* 6 (* 5 (fac 4)))) (* 7 (* 6 (* 5 (* 4 (fac 3))))) (* 7 (* 6 (* 5 (* 4 (* 3 (fac 2)))))) (* 7 (* 6 (* 5 (* 4 (* 3 (* 2 (fac 1))))))) (* 7 (* 6 (* 5 (* 4 (* 3 (* 2 1)))))) (* 7 (* 6 (* 5 (* 4 (* 3 2))))) (* 7 (* 6 (* 5 (* 4 6)))) (* 7 (* 6 (* 5 24))) (* 7 (* 6 120)) (* 7 720) 5040

17 fac, versjon 2 17 Vi kan også utrykke n! med en annen prosedyre som genererer en annen type prosess. Her gjør vi rekursjonen i en internt definert hjelpeprosedyre. (define (fac n) (define (fac-iter prod count) (if (> count n) prod (fac-iter (* count prod) (+ count 1)))) (fac-iter 1 1)) I stedet for å etterlate ventende prosedyrekall legger vi til en akkumulator-variabel som akkumulerer produktet fortløpende... og en teller-variabel for å definere basistilfellet. Når vi når basistilfellet er den endelige returverdien ferdig beregnet.

18 fac, versjon 2 (forts.) 18 Prosedyren er fortsatt rekursiv. Men den beskriver en iterativ prosess. Prosessen vokser ikke; mengden informasjon som må huskes er konstant. (define (fac n) (define (fac-iter prod count) (if (> count n) prod (fac-iter (* count prod) (+ count 1)))) (fac-iter 1 1)) Kan til enhver tid oppsummeres med et gitt antall tilstandsvariabler; i dette tilfellet akkumulator- og teller-variablene og input. Antall trinn som utføres i fac vokser fortsatt lineært med n (O(n)). Men plassbehovet er konstant (O(1)).

19 Iterativ prosess 19 Igjen omskriver vi prosedyrekallene for å visualisere hvordan den komputasjonelle prosessen utvikler seg:? (fac 7) (fac-iter 1 1) (fac-iter 1 2) (fac-iter 2 3) (fac-iter 6 4) (fac-iter 24 5) (fac-iter 120 6) (fac-iter 720 7) (fac-iter ) 5040

20 n! som rekursiv og iterativ prosess 20 Rekursiv prosess? (define (fac n) (if (= n 0) 1 (* n (fac (- n 1))))) Iterativ prosess (define (fac n) (define (fac-iter prod count) (if (> count n) prod (fac-iter (* count prod) (+ count 1)))) (fac-iter 1 1))? (fac 7) (* 7 (fac 6)) (* 7 (* 6 (fac 5))) (* 7 (* 6 (* 5 (fac 4)))) (* 7 (* 6 (* 5 (* 4 (fac 3))))) (* 7 (* 6 (* 5 (* 4 (* 3 (fac 2)))))) (* 7 (* 6 (* 5 (* 4 (* 3 (* 2 (fac 1))))))) (* 7 (* 6 (* 5 (* 4 (* 3 (* 2 1)))))) (* 7 (* 6 (* 5 (* 4 (* 3 2))))) (* 7 (* 6 (* 5 (* 4 6)))) (* 7 (* 6 (* 5 24))) (* 7 (* 6 120)) (* 7 720) 5040? (fac 7) (fac-iter 1 1) (fac-iter 1 2) (fac-iter 2 3) (fac-iter 6 4) (fac-iter 24 5) (fac-iter 120 6) (fac-iter 720 7) (fac-iter ) 5040

21 fac, versjon 2 (forts.) 21 Legg også merke til at det rekursive kallet står i tail position (det siste som utføres i prosedyren). Kan sende returverdien direkte fra det innerste kallet til stedet for det ytterste kallet: tail call elimination. (define (fac n) (define (fac-iter prod count) (if (> count n) prod (fac-iter (* count prod) (+ count 1)))) (fac-iter 1 1)) Prosedyrens returverdi er den samme som returverdien for det siste rekursive kallet; den er halerekursiv (tail recursive). Alle Scheme-implementasjoner forutsettes å kunne oppdage når det foreligger halerekursjon og foreta tail call elimination. PS: SICP reserverer termen tail recursive til denne siste egenskapen som egentlig ligger hos interpreteren/kompilatoren, og beskriver ikke prosedyrer i seg selv om halerekursive.

22 Fibonaccitall 22 For å illustrere nok en annen type rekursiv prosess skal vi se på en prosedyre for å beregne tall i den såkalte Fibonacci-rekken: 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, Bortsett fra de to første er hvert tall gitt som summen av de to foregående. Før vi når basistilfellene fører hvert kall på fib til to nye rekursive kall. Gir opphav til en såkalt tre-rekursiv prosess. 0 hvis n = 0 fib(n) = 1 hvis n = 1 fib(n 1) + fib(n 2) ellers? (define (fib n) (cond ((= n 0) 0) ((= n 1) 1) (else (+ (fib (- n 1)) (fib (- n 2))))))? (fib 5) 5? (fib 6) 8? (fib 7) 13? (fib 8) 21? (fib 9) 34

23 Tre-rekursiv prosess 23 Veldig mange dupliserte operasjoner. Eksponensiell vekst i tidsbruk; proporsjonal med antall noder. Minnebruken vokser likevel lineært i n, proporsjonal med tredybden (fordi hver operasjon kun trenger å huske det som er ovenfor i treet). (fib 5) (fib 4) (fib 3) (fib 2) (fib 3) (fib 2) (fib 1) (fib 1) (fib 0) 1 (fib 1) (fib 0) (fib 2) (fib 1) (fib 1) (fib 0) 1 1 0

24 fib, versjon 2 24 Vår første versjon av fib er håpløst lite effektiv. Men det betyr ikke at tre-rekursive prosesser ikke har sin plass: Når vi senere skal jobbe med hierarkiske data vil de være både elegante og nyttige! (define (fib n) (define (fib-iter a b count) (if (= count 0) b (fib-iter (+ a b) a (- count 1)))) (fib-iter 1 0 n)) Men fib kan vi omskrive til en mer effektiv halerekursiv variant. Vi bruker to akkumulator-variabler, initialisert til fib(1) og fib(0), som fortløpende oppdateres. En teller-variabel forteller når vi er ferdig. Beskriver en iterativ prosess som er lineær i n.

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 Universitetet i Oslo 26. januar 2017 På blokka 2 Forrige uke Introduksjon og oversikt Praktiske detaljer Funksjonell

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 Universitetet i Oslo 26. januar 2017 På blokka Forrige uke Introduksjon og oversikt Praktiske detaljer Funksjonell

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 Universitetet i Oslo 26. januar 2016 På blokka Forrige uke Introduksjon og oversikt Praktiske detaljer Funksjonell

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

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

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

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

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

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

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

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

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

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

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

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

INF2810: Funksjonell programmering: Introduksjon

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

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

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. Strømmer

INF2810: 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

Detaljer

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser

INF2810: Funksjonell Programmering. Oppsummering og eksamensforberedelser INF2810: Funksjonell programmering INF2810: Funksjonell Programmering Oppsummering og eksamensforberedelser Erik Velldal & Stephan Oepen Universitetet i Oslo 31. mai 2016 I dag Kort oppsummering Praktisk

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 31. mai 2016 I dag 2 Kort oppsummering Praktisk om eksamen Hvem vant konkurransen

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

INF2810: Funksjonell Programmering. Lister og høyereordens prosedyrer

INF2810: 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

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

(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

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

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

INF2810: Funksjonell Programmering. Mer om strømmer

INF2810: 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

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

Forelesning 29: Kompleksitetsteori

Forelesning 29: Kompleksitetsteori MAT1030 Diskret Matematikk Forelesning 29: Kompleksitetsteori Roger Antonsen Institutt for informatikk, Universitetet i Oslo Forelesning 29: Kompleksitetsteori 13. mai 2009 (Sist oppdatert: 2009-05-17

Detaljer

MAT1030 Diskret Matematikk

MAT1030 Diskret Matematikk MAT1030 Diskret Matematikk Forelesning 29: Kompleksitetsteori Roger Antonsen Institutt for informatikk, Universitetet i Oslo 13. mai 2009 (Sist oppdatert: 2009-05-17 22:38) Forelesning 29: Kompleksitetsteori

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

MAT1030 Diskret Matematikk

MAT1030 Diskret Matematikk MAT1030 Diskret Matematikk Plenumsregning 1: Kapittel 1 Mathias Barra Matematisk institutt, Universitetet i Oslo 16. januar 2009 (Sist oppdatert: 2009-02-02 14:21) Plenumsregning 1 MAT1030 Diskret Matematikk

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

Plenumsregning 1. Kapittel 1. Roger Antonsen januar Velkommen til plenumsregning for MAT1030. Repetisjon: Algoritmer og pseudokode

Plenumsregning 1. Kapittel 1. Roger Antonsen januar Velkommen til plenumsregning for MAT1030. Repetisjon: Algoritmer og pseudokode Plenumsregning 1 Kapittel 1 Roger Antonsen - 17. januar 2008 Velkommen til plenumsregning for MAT1030 Torsdager 10:15 12:00 Gjennomgang av ukeoppgaver Gjennomgang av eksempler fra boka Litt repetisjon

Detaljer

Repetisjon Novice Videregående Python PDF

Repetisjon Novice Videregående Python PDF Repetisjon Novice Videregående Python PDF Introduksjon I denne oppgaven skal vi repetere litt Python-syntaks. Hele dette kurset er for de som har programmert Python før. Dersom ikke har mye erfaring med

Detaljer

MAT1030 Plenumsregning 1

MAT1030 Plenumsregning 1 MAT1030 Plenumsregning 1 Kapittel 1 Mathias Barra - 16. januar 2009 (Sist oppdatert: 2009-02-02 14:21) Plenumsregning 1 Velkommen til plenumsregning for MAT1030 Fredager 12:15 14:00 Vi vil gjennomgå utvalgte

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

Notat 2, ST Sammensatte uttrykk. 27. januar 2006

Notat 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

Detaljer

Programmering i R. 6. mars 2004

Programmering i R. 6. mars 2004 Programmering i R 6. mars 2004 1 Funksjoner 1.1 Hensikt Vi har allerede sette på hvordan vi i et uttrykk kan inkludere kall til funksjoner som er innebygd i R slik som funksjonene sum, plot o.s.v. Generelt

Detaljer

Plenumsregning 1. MAT1030 Diskret Matematikk. Repetisjon: Algoritmer og pseudokode. Velkommen til plenumsregning for MAT1030

Plenumsregning 1. MAT1030 Diskret Matematikk. Repetisjon: Algoritmer og pseudokode. Velkommen til plenumsregning for MAT1030 MAT1030 Diskret Matematikk Plenumsregning 1: Kapittel 1 Mathias Barra Matematisk institutt, Universitetet i Oslo Plenumsregning 1 16. januar 2009 (Sist oppdatert: 2009-02-02 14:21) MAT1030 Diskret Matematikk

Detaljer

INF3140 Modeller for parallellitet INF3140/4140: Programanalyse

INF3140 Modeller for parallellitet INF3140/4140: Programanalyse INF3140/4140: Programanalyse Uke 4, side 1. Hvordan sjekke egenskaper ved programmer? Testing eller debugging øker tilliten til programmet ved prøving, men gir ingen garanti for korrekthet Operasjonell

Detaljer

Rekursiv programmering

Rekursiv 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

Detaljer

MAT1030 Diskret matematikk

MAT1030 Diskret matematikk MAT1030 Diskret matematikk Plenumsregning 1: Kapittel 1 Roger Antonsen Matematisk Institutt, Universitetet i Oslo 17. januar 2008 Velkommen til plenumsregning for MAT1030 Torsdager 10:15 12:00 Gjennomgang

Detaljer

Metoder med parametre, løkker og arrayer

Metoder med parametre, løkker og arrayer Metoder med parametre, løkker og arrayer Løse problemer med programmering INF1000, uke3 Ragnhild Kobro Runde METODER MED PARAMETRE Statiske void-metoder med parametre Den typen metoder vi så på forrige

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

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

Løkker og arrayer. Løse problemer med programmering. INF1000, uke3 Geir Kjetil Sandve

Løkker og arrayer. Løse problemer med programmering. INF1000, uke3 Geir Kjetil Sandve Løkker og arrayer Løse problemer med programmering INF1000, uke3 Geir Kjetil Sandve Hva vi har lært så langt Variabler og uttrykk Beslutninger Kontrollflyt og feilmeldinger Metoder og parametre Fokus i

Detaljer

I denne oppgaven skal vi repetere litt Python-syntaks, det er en god blanding av alle tingene du har lært i Python til nå.

I denne oppgaven skal vi repetere litt Python-syntaks, det er en god blanding av alle tingene du har lært i Python til nå. Repetisjon Skrevet av: Ole Kristian Pedersen, Kodeklubben Trondheim Kurs: Python Tema: Tekstbasert Fag: Programmering Klassetrinn: 8.-10. klasse Introduksjon I denne oppgaven skal vi repetere litt Python-syntaks,

Detaljer

"behrozm" Oppsummering - programskisse for traversering av en graf (dybde først) Forelesning i INF februar 2009

behrozm Oppsummering - programskisse for traversering av en graf (dybde først) Forelesning i INF februar 2009 Rekursiv programmering BTeksempel Datastruktur I klassen Persontre (rotperson==) Rekursjon Noen oppgaver/problemer er rekursive «av natur» Eksempel på en rekursiv definisjon Fakultetsfunksjonen

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

Lisp 2: Lister og funksjoner

Lisp 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)

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