Funktionell programmering DD1361

Relevanta dokument
DD1361 Programmeringsparadigm. Carina Edlund

Datalogi, grundkurs 1

Datalogi, grundkurs 1. Lösningsförslag till tentamen

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson 2

Dagens föreläsning Programmering i Lisp Fö 5

Introduktion till Haskell

Deklarationer/definitioner/specifikationer

Sista delen av kursen

TDDC74 Programmering: Abstraktion och modellering Tenta, kl 14 18, 11 juni 2014

Programspråkslingvistik. Sista delen av kursen. Ett programspråk

Föreläsning 5 i programmeringsparadigm.

LÖSNINGSFÖRSLAG TENTAMEN PROGRAMMERING I ETT FUNKTIONELLT SPRÅK ML, 5P

Idag: Par och listor. Symboler. Symboler används för att uttrycka icke-numeriska data såsom namn, adress, bilregisternummer, boktitel, osv.

Typsystem. Typsystem... Typsystem... Typsystem... 2 *

TDDC74 Lab 02 Listor, sammansatta strukturer

Typsystem. DA2001 (Föreläsning 23) Datalogi 1 Hösten / 19

n Detta för att kunna koncentrera oss på n Tal: number? n Symboler: symbol? n Strängar: string? n Tecken: char? n Boolskt: boolean?

Sista delen av kursen

6 Rekursion. 6.1 Rekursionens fyra principer. 6.2 Några vanliga användningsområden för rekursion. Problem löses genom:

Föreläsning 6: Introduktion av listor

Imperativ och Funktionell Programmering i Python #TDDD73. Fredrik Heintz,

Föreläsning 6 i programmeringsparadigm. Tips kring programmering i Haskell och kring labbarna.

Föreläsning 4 (och 5?) i programmeringsparadigm.

Två fall: q Tom sekvens: () q Sekvens av element: (a b c) ; (sum-rec '(2 4 6)) = 12. q Första elementet uppfyller vissa villkor: (2 a b c)

Idag: Par och listor. Scheme. DA2001 (Föreläsning 6) Datalogi 1 Hösten / 29

Föreläsning 7 Innehåll. Rekursion. Rekursiv problemlösning. Rekursiv problemlösning Mönster för rekursiv algoritm. Rekursion. Rekursivt tänkande:

Föreläsning 13. Rekursion

TDDC74 Programmering: Abstraktion och modellering Dugga 2, Tid: kl 08-10, Datum:

Föreläsning 4 (och 5?) i programmeringsparadigm.

Men först: Några funktioner ur preluden. Introduktion till programmering. Uppgiften. Variationer av uppgiften. Föreläsning 4

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

Lösningsförslag. TDDC74 Programmering: Abstraktion och modellering. Dugga 3 (provkod TEN1), Tid: kl 14-16, Datum:

TDDC74 Programmering, abstraktion och modellering. Tentamen

Tentamen Grundläggande programmering

TDDC74 Programmering: Abstraktion och modellering. Provkod TEN1, Tid: kl 14-18, , Kåra

Programmera i C Varför programmera i C när det finns språk som Simula och Pascal??

Programmering II (ID1019) :00-11:00

Textsträngar från/till skärm eller fil

TDDC74 Lab 04 Muterbara strukturer, omgivningar

Programmering II (ID1019) :00-12:00

Dagens föreläsning Programmering i Lisp. - Bindning av variabler (avs 14.6) fria variabler statisk/lexikalisk och dynamisk bindning

Föreläsning 9 Exempel

Repetition i Python 3. Exemplen fac. Exemplen fac motivering. Exemplen fac i Python

TDDC74 Programmering: Abstraktion och modellering Datortenta , kl 14-18

TDDC74 Programmering, abstraktion och modellering. Tentamen

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Enjoy Vattenfallsmodellen i funktionella språk

Sökning och sortering

Sökning och sortering. Sökning och sortering - definitioner. Sökning i oordnad lista. Sökning med vaktpost i oordnad lista

Kungliga Tekniska Högskolan Ämneskod 2D1370 Tentamensdag 2001-maj-31 Tentamen i Funktionell Programmering Skrivtid 4 h

Föreläsningsanteckningar, Introduktion till datavetenskap HT S4 Datastrukturer. Tobias Wrigstad

Repetition i Pascal. Exemplen fac. Exemplen fac i Pascal. Exemplen fac motivering. Orginalet

Erfarenheter från labben

Några saker till och lite om snabbare sortering

TDDC74 - Lektionsmaterial C

Lösningsförslag: Instuderingsfrågor, del D

Dagens föreläsning Programmering i Lisp Fö 7. Sammanfattning funktionell programmering Exempel på funktionella programspråk

Föreläsning 9 Exempel. Intervallhalveringsmetoden. Intervallhalveringsmetoden... Intervallhalveringsmetoden...

Datalogi, grundkurs 1

Signalflödesmodellen. Två (gamla) exempel: Kvadratera alla jämna löv.

SCB :-0. Uno Holmer, Chalmers, höger 2 Ex. Induktiv definition av lista. // Basfall

Abstraktion. Abstraktion... Abstraktion... Abstraktion...

Dagens föreläsning. Diverse Common Lisp. Konstanter, parametrar, globala variabler

Abstraktion. procedurabstraktion. DA2001 (Föreläsning 26) Datalogi 1 Hösten / 27

Haskell forts. 5DV085 - Programspråk. Jan Erik Moström, Department of Computing Science, Umeå University - jem@cs.umu.se

Python. Datatyper. Mer om datatyper. Heltal - 3 Flyttal - 2,456 Listor - [1,2,3,4] Strängar - spam!

TDDC74 Programmering, abstraktion och modellering. Tentamen

Sammansatta datatyper Generics: Parametrisk polymorfism

Algoritmanalys. Genomsnittligen behövs n/2 jämförelser vilket är proportionellt mot n, vi säger att vi har en O(n) algoritm.

Programmeringsmetodik DV1 Programkonstruktion 1. Moment 4 Om rekursion. PK1&PM1 HT-06 moment 4 Sida 1 Uppdaterad

Generic type declarations. Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2016

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python TDDE24 Funktionell och imperativ programmering del 2

TDDC74 Programmering: Abstraktion och modellering Dugga 2, kl 8 10, 5 mars 2015

Tentamen'('Datastrukturer,'algoritmer'och'programkonstruktion.'

DD1320 Tillämpad datalogi. Lösning (skiss) till tenta 20 okt 2011

Programmering II (ID1019) :00-12:00

Sökning i ordnad lista. Sökning och sortering. Sökning med vaktpost i oordnad lista

Pythons standardbibliotek

Tentamen i Introduktion till programmering

Datastrukturer, algoritmer och programkonstruktion (DVA104, VT 2015) Föreläsning 6

Universitetet i Linköping Institutionen för datavetenskap Anders Haraldsson

Föreläsning 8 Datastrukturer (DAT037)

maxlist-1. Indexerad lista Länkad lista

Programkonstruktion och Datastrukturer

Föreläsning 2 Programmeringsteknik och C DD1316. Mikael Djurfeldt

LÖSNINGSFÖRSLAG TENTAMEN

I ett program hantera man ofta samlingar av objekt av samma typ.

Att deklarera och att använda variabler. Föreläsning 10. Synlighetsregler (2) Synlighetsregler (1)

Instruktioner - Datortentamen TDDD73 Funktionell och imperativ programmering i Python

Arrayer (vektorer) Murach s: kap Elektronikcentrum i Svängsta AB

Tentamen TEN1 HI

Tentamen i Grundläggande Programvaruutveckling, TDA548

Namn: (Ifylles av student) Personnummer: (Ifylles av student) Tentamensdatum: Tid: Hjälpmedel: Inga hjälpmedel

Kontinuerliga listor. Fält (listor) Kontinuerliga listor... Kontinuerliga listor...

GOTO och lägen. Några saker till och lite om snabbare sortering. GOTO och lägen (3) GOTO och lägen (2)

Rekursiva algoritmer sortering sökning mönstermatchning

Datalogi, grundkurs 1 Övningsuppgifter i Scheme. Serafim Dahl, Carina Edlund, m.fl.

DAT043 - föreläsning 8

TDIU01 - Programmering i C++, grundkurs

Exempel på listor (klassen ArrayList). Ett exempel med fält. Avbildning är en speciell typ av lista HashMap.

Transkript:

Funktionell programmering DD1361

Tupler Två eller fler (men ändligt) antal element. Elementen kan vara av olika typer. Ex: (1,2) :: (Integer, Integer) (( 2, hejsan ), True) ::? Tupel med två element -> ett par. Kan använda funktionerna fst och snd. fst(1,2) -> 1 Varför inte en tupel med ett element, t.ex. (+)?

Listor allmänt I imperativa språk används t.ex. pekare och poster för att explicit bygga upp en önskad liststruktur. Dvs man allokerar minnesutrymme för posten, länkar samman den med listan och bygger på så sätt ut listan. En fin bild på hur det kan se ut!

Diskontinuerlig lista, ~C delprogram (listpekare, värde) allokera minnesutrymme för post om allokering ok tilldela posten dess värde länka posten till listan återsänd den nya listan annars signalera fel Finns det sidoeffekter?

Listor i scheme Byggs upp av par, där det sista elementet är den tomma listan, (). cons sätter ihop två komponenter till ett par. car, cdr plockar ut den första respektive den andra komponenten ur ett par. Anrop Resultat (cons 2 ()) -> (2) (cons 2 (cons 3 ())) -> (2 3) (car (cons 2 (cons 3 ()))) -> 2 (cdr (cons 2 (cons 3 ()))) -> (3)

Listor i Haskell Godtyckligt antal element av samma typ. Ett element sätts in i en lista med hjälp av : En äkta lista har alltid den tomma listan, [] sist. Exempel: Prelude> 2:[] Prelude> [True, False] [2] [True, False] Prelude> 3:[2] Prelude> [ Hej, då ] [3,2] [ Hej, då ]

Arbeta med listor i Haskell Prelude> 2:(3:(6:[])) [2,3,6] Prelude> 8:[2,3,6] [8,2,3,6] Prelude> [1,2]++[4,3] [1,2,4,3] Prelude> null [] True Prelude> null [2,3,4] False Prelude> head [2,3,6] 2 Prelude> tail [2,3,6] [3,6] Prelude> elem 2 [2,3] True Prelude> length [2,3] 2 Prelude> sum [2,3] 5

Polymorfism Vilken typ har length? Prelude> :t length length :: [a] -> Int a är en typvariabel Polymorf funktion: Kan tillämpas på flera typer. Polymorf typ: Kan anta flera former (Hutton)

Fler polymorfa exempel Prelude> :type head head :: [a] -> a Prelude> :t tail tail :: [a] -> [a] Prelude> :t fst fst :: (a,b) -> a

Listlängd 1. Är listan tom är längden noll 2. Addera ett till längden av resten av listan Scheme (define length (lambda (lista) (if (null? lista) 0 (+ 1 (length (cdr lista))))))

map, en viktig listfunktion Typsignatur: map :: (a -> b) -> [a] -> [b] Prelude> map length ["Asp","Gran","Ek"] [3,4,2] I detta exempel gäller: a: String b: Int

Mösterpassning på listor Huvudet på en lista: head [] = error No head on an empty list! head (e:restoflist) = e eller head [] = error No head on an empty list! head (e:_) = e

Strängar En sträng är en lista med tecken, dvs String är synonymt med [Char] a : b : c :[] :: String [ a, b, c ] :: String abc :: String Prelude> head hejsan h Prelude> tail rot ++ a :[] ota

Räkna blanka i en sträng, 1 countspaces :: String -> Int countspaces [] = 0 countspaces (c : restofstring) = d + countspaces restofstring where d = if c == then 1 else 0 Prelude> countspaces X Y Z 3 Vad händer med countspaces "X Y Z "?

Rekursionssteg countspaces X Y Z 0 + countspaces Y Z 0 + 1 + countspaces Y Z 0 + 1 + 0 + countspaces Z 0 + 1 + 0 + (1 + countspaces Z ) 0 + 1 + 0 + (1 + 0 + countspaces ) 0 + 1 + 0 + (1 + 0 + (1 + countspaces )) 0 + 1 + 0 + (1 + 0 + (1 + 0)) 0 + 1 + 0 + (1 + 0 + 1) 1 + 2 3 Det belastar stacken!

Räkna blanka i en sträng, 2 countspaces :: String -> Int countspaces [] = 0 countspaces ( : restofstring) = 1 + countspaces restofstring countspaces (_ : restofstring) = 0 + countspaces restofstring

Räkna blanka i en sträng, 3 countspaces :: String -> Int countspaces [] = 0 countspaces (c : restofstr) c == = 1 + countspaces restofstr otherwise = countspaces restofstr

Räkna blanka i en sträng, 4 countspaces :: String -> Int countspaces s = count 0 s count n [] = n count n (c : restofstr) c == = count (n+1) restofstr otherwise = count n restofstr Ackumulering av resultatet i parametern n.

Räkna blanka i en sträng, 5 countspaces :: String -> Int countspaces s = count 0 s where count n [] = n count n (c : restofstr) c == = count (n+1) restofstr otherwise = count n restofstr count är lokal för countspaces och syns inte för andra funktioner! Eng: local scope.

Vad händer i count? count 0 X Y Z count 0 Y Z count 1 Y Z count 1 Z count 2 Z count 2 count 3 3

Från loop till rekursion Räkna vokaler och konsonater function count(string s){ int ncons = 0; int nvow = 0; for (int i=0; i++; i<length(s)) { if (iscons(s[i])) then { ncons++; } else if isvow(s[i]) then { nvow++; } } return (ncons, nvow);}

Recept: loop till rekursion En loop ersätts med en inre funktion. Varje aktiv variabel i loopen blir en parameter i rekursionen. Stoppvillkoret blir basfall. Starta rekursionen med loopens starttillstånd. Tillämpa receptet for-loopen ersätts med funktionen loop. loop har 3 parametrar: i, ncons och nvow. Basfallet blir i>=length s. Startanrop: loop 0 0 0 (dvs i=0, ncons=0, nvow=0)

Räkna vokaler och konsonanter count :: String -> (Int, Int) count s = loop s 0 0 where loop [] ncons nvow = (ncons, nvow) loop (c:str) ncons nvow iscons c = loop str (ncons+1) nvow isvow c = loop str ncons (nvow+1) otherwise = loop str ncons nvow

Ömsesidig rekursion Rensa bort LaTex-kommentarer i en given sträng Från % till radslut. remcom :: String -> String remcom [] = [] -- Basfall! remcom ( % : str) = stripcom str remcom (c : str) = c : remcom str stripcom :: String -> String stripcom [] = [] stripcom ( \n : str) = \n : remcom str stripcom (_ : str) = stripcom str

Listomfattning Hur kan vi dubblera alla udda tal större än 3 i en lista? 1. Gå igenom listan rekursivt ett element i taget och bygg upp en ny lista med de element som uppfyller kraven har dubblerats. 2. Filtrera bort allt man inte vill ha, resten dubbleras. 3. Tänk matematiskt. M = {2*x; x>3, x udda, x {1..6}} Använd listomfattning, (listan [1..6] är hårdkodad): [2*n n <- [1,2.. 6], odd n, n>3] 3. Ytterligare idéer?

Kompakt quicksort Välj ett pivotelement x. Sortera alla element mindre än x. Sortera alla element större än x. Sätt samman resultatet. Med listomfattning: qsort [] = [] qsort (x:xs) = qsort [e e <- xs, e<x] ++ [x] ++ qsort [e e <- xs, e>=x]

Listomfattning Pythagoras tal, a 2 + b 2 : pythagoras n = [a^2+b^2 a <- [1..n], b <-[a..n]] Prelude> pythagoras 5 [2,5,10,17, osv ] Testa själva!!! Returnera tupler med mer info: pythagoras n = [(a^2+b^2,a,b) a<- [1..n], b <-[a..n]] Prelude> pythagoras 5 [(2,1,1),(5,1,2), osv ] Testa själva!!!