Programmering og Problemløsning, 2017

Relaterede dokumenter
Programmering og Problemløsning, 2017

Programmering og Problemløsning, 2017

Programmering og Problemløsning, 2017

Programmering og Problemløsning, 2017

Programmering og Problemløsning, 2017

Programmering og Problemløsning, 2017

Programmering og Problemløsning, 2017

Skriftlig Eksamen Algoritmer og Datastrukturer 1. Datalogisk Institut Aarhus Universitet

Programmering og Problemløsning, 2017

Løsningsforslag Skriftlig eksamen 9. januar 2012

Løsningsforslag Skriftlig eksamen 5. januar 2011

Skriftlig eksamen i Datalogi

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: 4 n n 3n n 2 /logn 5 n n (logn) 3n n 2 /logn 4 n n 5 n

Programmering for begyndere Lektion 2. Opsamling mm

Listen over reserverede ord er meget lang, men de væsentligste vil jeg beskrive her i denne artikel:

Aarhus Universitet, Science and Technology, Computer Science. Exam. Wednesday 27 June 2018, 9:00-11:00

Induktive og rekursive definitioner

#AlleKanKode. Lektion 2 - Konstanter og Variabler

Forelæsning Uge 2 Mandag

Kapitel 4 Løkker i C#

Skriftlig Eksamen Algoritmer og Datastrukturer 1. Datalogisk Institut Aarhus Universitet. Mandag den 22. marts 2004, kl

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Algoritmeskabeloner: Sweep- og søgealgoritmer C#-version

Moduler i Standard ML

Sproget Six. Til brug i rapportopgaven på kurset Oversættere. Vinter Abstract

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Et udtryk er (som bekendt?) lineært hvis den differentierede er en konstant funktion, dvs. at den ikke afhænger af x. Betragt f lgende værdiprocedurer

Skriftlig eksamen i Datalogi

Grådige algoritmer. Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

DATALOGISK INSTITUT, AARHUS UNIVERSITET

3 Algebraisk Specifikation af Abstrakte Datatyper.

Forelæsning Uge 2 Mandag

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: n 2 n (log n) 2. 3 n /n 2 n + (log n) 4

Forelæsning Uge 2 Torsdag

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: 5n 4. logn. n 4n 5 n/logn. n n/logn 5n

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: (logn) 2 2 n 1/n (logn) n. n 2

Forelæsning Uge 4 Mandag

MS Visual Studio Basic En kort vejledning

Forelæsning Uge 2 Mandag

Grådige algoritmer. Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: n 7 n 1 7 7/n. 7nlogn. 7n 7nlogn n7

Forelæsning 17, tirsdag 2. november 1999 Søgning efter en given værdi i en tabel. Programmering 1999

"# $%$ " # $ % $ $ " & ( ) *+!,! Sum_Cost >= 5000SirName = Beltov Continue = %!- + ( ( - True) Continue *! If Antal <= 20 Then EnhedsOmk = 1.

Datalogi 0 GA Forelæsning september 2003 Nils Andersen. Tegn og tekster. Listefunktionalen map. Naïv sortering

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Grådige algoritmer. Et generelt algoritme-konstruktionsprincip ( paradigme ) for optimeringsproblemer.

INSTITUT FOR DATALOGI, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Skriftlig Eksamen Algoritmer og Datastrukturer (dads)

26 Programbeviser I. Noter. PS1 -- Programbeviser I. Bevis kontra 'check af assertions' i Eiffel. Betingelser og bevisregler.

User Guide AK-SM 720 Boolean logic

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: (logn) 5. 5n 2 5 logn. 2 logn

INSTITUT FOR DATALOGI, AARHUS UNIVERSITET. Science and Technology EKSAMEN. Grundkurser i Datalogi. Algoritmer og Datastrukturer 1 (2003-ordning)

Syntaks og syntaksgenkendelse, særligt regulære udtryk og tilstandsmaskiner og lidt om anvendelser i bioinformatik

Korteste veje i vægtede grafer. Længde af sti = sum af vægte af kanter på sti.

Rekursion C#-version

INSTITUT FOR DATALOGI, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Kapitel 3 Betinget logik i C#

Programmeringscamp. Implementer funktionerne én for én og test hele tiden.

Forelæsning Uge 2 Mandag

A Profile for Safety Critical Java

Korteste veje i vægtede grafer. Længde af sti = sum af vægte af kanter på sti.

Forelæsning Uge 1 Torsdag

$ %' ) * %' +,! - Myarray %' /0 / /0 /0

Yderligere udvidelser af oversætter for Minimal

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen (bemærk at log n betegner totals logaritmen): n 2 (log n) 2 2.

University of Southern Denmark Syddansk Universitet. DM502 Forelæsning 4

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Eksempel: Skat i år 2000

Øvelse 9. Klasser, objekter og sql-tabeller insert code here

NVivo-øvelser for PC. Når NVivo er åbent, kan importen ske på to måder:

b) Udvid din implementation af forme til at understøtte.equals. To objekter af samme form er ens hvis de har samme værdier i felterne.

Hent filoplysninger fra billeder og filer

Forelæsning Uge 2 Mandag

DATALOGISK INSTITUT, AARHUS UNIVERSITET. Det Naturvidenskabelige Fakultet EKSAMEN. Grundkurser i Datalogi

Sproget Limba. Til brug i G1 og K1. Dat1E 2003

Opskriv følgende funktioner efter stigende orden med hensyn til O-notationen: n+logn logn (logn) 7 (3/2) n

Software Design (SWD) Spørgsmål 1

! "# $$ &'()*"* +*, & &"*0* & "# % %- %

Hanne Niels Edith Harald Carsten Jørgen Henrik.

Opgave 1 (10%) I det følgende angiver log n 2-tals-logaritmen af n. Ja Nej. n+3n er O(2n)? n 6 er O(n 5 )? nlogn er O(n 2 /logn)? 4n 3 er O(3n 4 )?

Spil Master Mind. Indledning.

Repræsentation af tal

Danmarks Tekniske Universitet

Løsningsforslag Skriftlig eksamen 3. januar 2013

Engineering of Chemical Register Machines

Kursus i OOP og Java. Kursus i Objektorienteret programmering i Java

Kursus 02199: Programmering. Kontrol af programudførelsen. afsnit if (indkomst > ) topskat = (indkomst ) * 0.

SWC eksamens-spørgsmål. Oversigt

Danmarks Tekniske Universitet

Værktøjer fra værktøjskassen. Søren Breddam, Stevns Kommune

Danmarks Tekniske Universitet

Kontrol-strukturer i PHP

BOSK F2011, 1. del: Udsagnslogik

Software Design (SWD) Spørgsmål 1

Lær Python dag 1 - modul 1

Danmarks Tekniske Universitet

Rekursion og dynamisk programmering

F# - hvorfor, hvordan og til hvad? Rune Ibsen Jyske Bank

Oracle PL/SQL. Overview of PL/SQL

#AlleKanKode. Lektion 4 - Kontrol flow

Transkript:

Programmering og Problemløsning, 2017 Typer og Mønstergenkendelse Martin Elsman Datalogisk Institut Københavns Universitet DIKU 23. Oktober, 2017 Martin Elsman (DIKU) Programmering og Problemløsning, 2017 23. Oktober, 2017 1 / 16

Outline 1 Typer og Mønstergenkendelse Typer Typeforkortelser Records Mønstergenkendelse Selection Sort genbesøgt Martin Elsman (DIKU) Programmering og Problemløsning, 2017 23. Oktober, 2017 2 / 16

Outline Typer Det er ofte hensigtsmæssigt at forstå typer som mængder af værdier. I dag vil vi se på type-begrebet, på hvordan vi kan udvidde begrebet til at klassificere flere slags værdier og på hvordan vi kan skrive genbrugelig type-invariant kode (generiske funktioner). Vi vil også se på forholdet mellem konstruktion og dekonstruktion af værdier. Specifikt vil vi se på begrebet mønstergenkendelse (pattern matching). 1 Typer kan forstås som mængder. 2 Type-forkortelser (type-abbreviations). 3 Typer for generisk kode. 4 Generiske type-forkortelser. 5 Mønstergenkendelse (pattern matching). 6 Selection-sort revisited. Martin Elsman (DIKU) Programmering og Problemløsning, 2017 23. Oktober, 2017 3 / 16

Typer Typer kan forstås som mængder af værdier Eksempler: int Z = {..., 2, 1, 0, 1, 2,...} float R int * float Z R = {..., (3, 1.2),...} (sæt af alle par med elementer fra Z og R) int list {[], [1], [2],..., [1; 2],...} int -> float Z R (sæt af alle afbildninger fra Z til R) bool = {true,false} unit = {()} Spørgsmål: 1 Hvorfor for de første fire tilfælde? 2 Hvorfor for funktioner? Martin Elsman (DIKU) Programmering og Problemløsning, 2017 23. Oktober, 2017 4 / 16

Typeforkortelser Typeforkortelser Det er nemt i F# at give et navn til en type for derved at gøre kode lettere læselig. type department = string type costs = (department * float) list let total (costs:costs) : float = List.fold (fun acc (_,f) -> acc+f) 0.0 costs Bemærk: Typen department er blot et synonym for typen string. Funktionen total kan derfor benyttes på alle værdier af typen (string*float) list. Martin Elsman (DIKU) Programmering og Problemløsning, 2017 23. Oktober, 2017 5 / 16

Typeforkortelser Type-generiske type-forkortelser Type-forkortelser kan være generiske således at det er muligt at skrive generisk kode der henviser til en type-forkortelse: // association lists mapping strings to values of type a type a alist = (string * a) list let add (m: a alist) (s:string) (v: a) : a alist = (s,v)::m let rec look (m: a alist) (s:string) : a option = if List.isEmpty m then None else if fst(list.head m) = s then Some(snd(List.head m)) else look (List.tail m) s let empty () : a alist = [] Bemærk: Vi kan benytte den tomme liste [] til at repræsentere den tomme associationsliste. Vi skal senere se hvorledes vi med moduler kan sikre at typen a alist bliver fuldt abstrakt således at kun de nævnte funktioner kan benyttes til at opererere på de konstruerede associationslister. Martin Elsman (DIKU) Programmering og Problemløsning, 2017 23. Oktober, 2017 6 / 16

Records Record-typer Records i F# giver mulighed for at navngive elementer i et tuple. Syntaksen for at definere en record-type er ganske enkelt: type person = {first:string; last:string; age:int} let xs = [{first="lene"; last="andersen"; age=56}; {last="hansen"; first="jens"; age=39}] let name (p:person) : string = p.first + " " + p.last let incr_age (p:person) : person = {p with age=p.age+1} let ys = List.map incr_age xs Bemærk: Ved konstruktion af en record er felt-rækkefølgen ubetydelig. Elementer i en record kan udtrækkes ved brug af dot-notationen (p.first). En ny record kan konstrueres (med et opdateret element) ved brug af with-konstruktionen. Martin Elsman (DIKU) Programmering og Problemløsning, 2017 23. Oktober, 2017 7 / 16

Mønstergenkendelse Mønstergenkendelse (Pattern matching) Generelt set giver mønstergenkendelse mulighed for at undersøge og nedbryde en værdi i dens bestanddele. Vi vil se på mønstergenkendelse ud fra typen på de værdier vi undersøger. I F# kan mønstergenkendelse optræde i flere forskellige programkonstruktioner: I simple let-bindinger. I match-with-konstruktioner. I funktionsparametre. Martin Elsman (DIKU) Programmering og Problemløsning, 2017 23. Oktober, 2017 8 / 16

Mønstergenkendelse Mønstergenkendelse på Tupler let x = (34,"hej",2.3) let (_,b,f) = x do printfn "%s:%f" b f // construct triple // use of wildcard (_) // b and f are available here Mønstergenkendelse på Records type person = {first:string; last:string; age:int} let name ({first=f;last=l}:person) = f + " " + l Bemærk: 1 Matching på records kræver blot at et udvalg af felt-navne er nævnt. 2 Hvis flere record-typer benytter samme felt-navne kan det være nødvendigt med type-annoteringer. 3 Mønstergenkendelse for tupler og records er også meget anvendte i funktionsparametre: let swap (x: a,y: b) : b * a = (y,x) Martin Elsman (DIKU) Programmering og Problemløsning, 2017 23. Oktober, 2017 9 / 16

Mønstergenkendelse Mønstergenkendelse på heltal og andre grundtyper Implementation af Fibonacci med mønstergenkendelse: let rec fib n = match n with 1 -> 1 2 -> 1 _ -> fib(n-1) + fib(n-2) let v = fib 10 Bemærk: 1 Den første bar ( ) i en match-case er optional. 2 Den første match-case der matcher vinder. 3 Wildcards (_) kan benyttes i en match-case. 4 Tilsvarende kan der matches på andre grundtyper, såsom karakterer, booleans og strenge. Martin Elsman (DIKU) Programmering og Problemløsning, 2017 23. Oktober, 2017 10 / 16

Mønstergenkendelse Mønstergenkendelse på option-værdier Typen int option er et eksempel på en simpel såkaldt sum-type, også kaldt discriminated union, som repræsenterer værdier der enten er værdien None eller er en værdi Some(v), hvor v er en værdi af typen int. Her er en funktion der løfter addition til værdier af typen int option: let add_opt (a:int option) (b:int option) : int option = match a, b with Some a, Some b -> Some(a+b) _ -> None Bemærk: 1 Der benyttes her en form for nested pattern matching på par af værdier af typen int option. 2 Ved konstruktion og matching af tupler kan man ofte undvære brugen af parenteser. 3 Variabler kan bindes i en match-case og henvises til i højre-siden af en match, hvor de vil varetage de matchede værdier. Martin Elsman (DIKU) Programmering og Problemløsning, 2017 23. Oktober, 2017 11 / 16

Mønstergenkendelse Mønstergenkendelse på lister Liste-værdier konstrueres grundlæggende set ved brug af to forskellige konstruktører: [] (Nil) Konstruktion af den tomme liste. x::xs (Cons) Konstruktion af et listeelement med hovedet x og halen xs (en anden liste). Samme to konstruktorer benyttes ved mønstergenkendelse på en liste: let rec length (l: a list) : int = match l with [] -> 0 x::xs -> 1 + length xs Mønstergenkendelse med function-konstruktionen let rec length : a list -> int = function [] -> 0 x::xs -> 1 + length xs Bemærk: Funktionsparameter og match-with-konstruktionen sammentrækkes. Martin Elsman (DIKU) Programmering og Problemløsning, 2017 23. Oktober, 2017 12 / 16

Mønstergenkendelse Nestede mønstergenkendelser på lister Liste-værdier kan matches til dybere niveauer end første cons-celle: let lengthy (l: a list) : bool = match l with _::_::_ -> true // at least two cells _ -> false Mønstre kan være mere komplekse: let rec ones (l: int list) : int = match l with [] -> 0 1::xs -> 1 + ones xs // match-cases are tested in order _::xs -> ones xs Martin Elsman (DIKU) Programmering og Problemløsning, 2017 23. Oktober, 2017 13 / 16

Selection Sort genbesøgt Selection Sort uden mønstergenkendelse Udtræk det mindste element i listen. Gentag processen rekursivt indtil der ikke længere er elementer i listen. En implementation i F#: let rec select (xs:int list) (m,ys) = if List.isEmpty xs then (m,ys) else let x = List.head xs let xs = List.tail xs in if x < m then if m <> System.Int32.MaxValue then select xs (x,m::ys) else select xs (x,ys) else select xs (m,x::ys) let rec ssort xs = if List.isEmpty xs then xs else let (m,xs) = select xs (System.Int32.MaxValue,[]) in m :: ssort xs Martin Elsman (DIKU) Programmering og Problemløsning, 2017 23. Oktober, 2017 14 / 16

Selection Sort genbesøgt Selection Sort med mønstergenkendelse Ny implementation i F#: let maxint = System.Int32.MaxValue let rec select (xs:int list) (m,ys) = match xs with [] -> (m,ys) x::xs -> if x < m then if m <> maxint then select xs (x,m::ys) else select xs (x,ys) else select xs (m,x::ys) let rec ssort = function [] -> [] xs -> let (m,xs) = select xs (maxint,[]) in m :: ssort xs Martin Elsman (DIKU) Programmering og Problemløsning, 2017 23. Oktober, 2017 15 / 16

Selection Sort genbesøgt Analyse af Selection Sort Set tidligere Funktionen select køres N gange og for hver kørsel gennemløbes listen (i gennemsnit N/2 elementer). Summary: Best time: O(N 2 ) Worst time: O(N 2 ) Average time: O(N 2 ) (animation) Martin Elsman (DIKU) Programmering og Problemløsning, 2017 23. Oktober, 2017 16 / 16