DD1361 Programmeringsparadigm. Carina Edlund

Relevanta dokument
Funktionell programmering DD1361

Procedurer och villkor

Procedurer och villkor. Rekursiva procedurer. Exempel: n-fakultet

Enjoy Vattenfallsmodellen i funktionella språk

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

Enjoy Vattenfallsmodellen i funktionella språk

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

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

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

Programmeringsteknik med C och Matlab

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

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

Programmering A. Johan Eliasson

Kompilering och exekvering. Föreläsning 1 Objektorienterad programmering DD1332. En kompilerbar och körbar java-kod. Kompilering och exekvering

Funktionell programmering. Haskell. Ge#ng started...

Introduktion till programmering D0009E. Föreläsning 5: Fruktbara funktioner

Föreläsning 2 Programmeringsteknik och C DD1316

TDIU01 - Programmering i C++, grundkurs

Föreläsning 5 i programmeringsparadigm.

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Pascal... Pascal. Pascal... Pascal...

Introduktion till programmering SMD180. Föreläsning 5: Fruktbara funktioner

Pascal. reserverade ord fördefinierade funktioner och procedurer egendefinierade funktioner, procedurer och objekt

Python. Python är, som Scheme, ett interpreterat språk men det finns kompilatorer för Python.

Introduktion till Haskell

Programmering i C++ En manual för kursen Datavetenskaplig introduktionskurs 5p

FÖRELÄSNING 2, TDDC74, VT2018 BEGREPP PROBLEMLÖSNING MED HJÄLP AV FALLANALYS PROBLEMLÖSNING MED HJÄLP AV REKURSION

Rekursion och induktion för algoritmkonstruktion

Våra enkla funktioner eller procedurer

Några inbyggda funktioner (med resultat!) Introduktion till programmering D0009E. Föreläsning 4: Villkor och rekursion. Modulus-operatorn.

TDDC74 PROGRAMMERING: ABSTRAKTION OCH MODELLERING VT 2017

Tentamen i Grundläggande Programvaruutveckling, TDA548

Tommy Färnqvist, IDA, Linköpings universitet. 2 Rekursion i C Implementation av rekursion Svansrekursion En till övning...

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

TDDC74 Lab 04 Muterbara strukturer, omgivningar

BEGREPP HITTILLS FÖRELÄSNING 2 SAMMANSATTA UTTRYCK - SCHEME DATORSPRÅK

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

Algoritmer och datastrukturer H I HÅKAN S T R Ö M B E R G N I C K L A S B R A N D E F E L T

Introduktion till programmering SMD180. Föreläsning 2: Variabler, uttryck och satser

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

Tentamen i. TDDA 69 Data och programstrukturer

Introduktion till programmering SMD180. Föreläsning 4: Villkor och rekursion

Användarhandledning Version 1.2

Datatyper och kontrollstrukturer. Skansholm: Kapitel 2) De åtta primitiva typerna. Typ Innehåll Defaultvärde Storlek

Variabler och konstanter

SMD 134 Objektorienterad programmering

Föreläsning 5. Rekursion

FÖRELÄSNING 1 PERSONAL TDDC74 PROGRAMMERING: ABSTRAKTION OCH MODELLERING VT 2017 SYFTE EXAMINATION ORGANISATION

Språket Python - Del 1 Grundkurs i programmering med Python

Föreläsning 6: Introduktion av listor

Inledande programmering med C# (1DV402) 27+15=42 1 (22)

Introduktion till programmering D0009E. Föreläsning 1: Programmets väg

Övning2. Variabler. Data typer

Dagens föreläsning. Repetition. Repetition - Programmering i C. Repetition - Vad C består av. Repetition Ett första C-program

Lambdas. (och fler design patterns) Objekt-orienterad programmering och design (DIT952) Niklas Broberg, 2017

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

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

Multipel tilldelning. Introduktion till programmering D0009E. Föreläsning 6: Iteration. while-satsen. Kom ihåg. Snurror kontra rekursion

I dag: Blockstruktur, omgivningar, problemlösning

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

Programkonstruktion och Datastrukturer

TDIU01 - Programmering i C++, grundkurs

HI1024 Programmering, grundkurs TEN

Iteration while-satsen

Data, typ, selektion, iteration

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 19 oktober 2016, kl 14 18

Metodanrop - primitiva typer. Föreläsning 4. Metodanrop - referenstyper. Metodanrop - primitiva typer

(Man brukar säga att) Java är... Denna föreläsning. Kompilering av Java. Historik: Java. enkelt. baserat på C/C++ Allmänt om Java

Föreläsning 8. Paradigmöversikt, paradigmhistoria, paradigmgeografi. Se även föreläsning 1.

Programmering med Java. Grunderna. Programspråket Java. Programmering med Java. Källkodsexempel. Java API-exempel In- och utmatning.

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

Deklarationer/definitioner/specifikationer

Sista delen av kursen

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

GPT föreläsning 8. Förra veckan: Man kan ta tiden på en sorterad teckensträng Förra gången: Problemlösning på lägre nivå kan sortera funktioner

TDDC74 Lab 02 Listor, sammansatta strukturer

Föreläsning 3: Booleans, if, switch

Klassdeklaration. Metoddeklaration. Parameteröverföring

Bankkonto - övning. Övning 2 Skriv en metod, geträntan, som returnerar räntan.

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

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

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

Tentamen i Programmering

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Tentamen i Grundläggande Programvaruutveckling, TDA548

Introduktion till algoritmer - Lektion 4 Matematikgymnasiet, Läsåret Lektion 4

Föreläsning 9 Exempel

Objektorienterad programmering i Java I. Uppgifter: 2 Beräknad tid: 5-8 timmar (OBS! Endast ett labbtillfälle) Att läsa: kapitel 5 6

Pythons standardbibliotek

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

Visual Basic, en snabbgenomgång

Anteckningar 1: Grundläggande saker

Bakgrund. Bakgrund. Bakgrund. Håkan Jonsson Institutionen för systemteknik Luleå tekniska universitet Luleå, Sverige

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

Tentamen. Datalogi I, grundkurs med Java 10p, 2D4112, Lördagen den 30 november 2002 kl , salar E33, E34

Del : Paradigmer allmänt.

Introduktion till programmering. Standardfunktioner. Vad används datorer till? Standardfunktioner. Föreläsning 2. Prelude. $ ghci...

Backcode. Jonathan Crusoe TDP019 Projekt: Datorspråk Linköpings universitet

Grundläggande datalogi - Övning 1

C++ Funktioner 1. int summa( int a, int b) //funktionshuvud { return a+b; //funktionskropp } Värmdö Gymnasium Programmering B ++ Datainstitutionen

Transkript:

DD1361 Programmeringsparadigm Carina Edlund carina@nada.kth.se

Funktionell programmering Grundidéen med funktionell programmering är att härma matematiken och dess funktionsbegrepp.

Matematiskt funktionsbegrepp En funktion från en mängd M till en mängd N är en regel som varje objekt i M på ett entydigt sätt ordnar ett objekt i N. (Persson, Böijers)

Haskells funktionsbegrepp Är en avbildning som tar ett eller flera argument och producerar ett enda resultat, och är definierad med hjälp av en ekvation som ger funktionen ett namn, ett namn för varje argument och en kropp som anger hur resultatet ska beräknas utifrån argumenten.(hutton, Sebesta)

Konsekvenser Ett språk som endast använder denna typ av funktioner kallas ett rent funktionellt språk. Funktionerna ger alltid samma resultat med samma indata. Funktionerna har inga sidoeffekter. Använder inte variabler eller tilldelningssatser vilket innebär att programmeraren inte behöver bry sig om minneshantering och tillstånd i programmet.

Funktioner i matematiken Ett klassiskt matte-exempel f(x) = x² eller tydligare square(x) = x² Eller exempel från nummen: rot_hittar_metod(gissad_rot, tolerens) diverse initieringar differentialekvationslösare(intervall, tid)

Enkel funktion, scheme (define kvadrat (lambda (x) (* x x)))

Enkel funktion Haskell kvadrat x = x*x OBS! Indenteringen är viktig!

Körning Funktionen skrivs Funktionen interpreteras eller kompileras Funktionen anropas, Scheme: (kvadrat 3) Haskell: kvadrat 3 Ett resultat beräknas och returneras

Haskell Vi kommer att använda Glasgow Haskell Compiler, GHC med dess interaktiva interpretator ghci CSC: module add ghc Starta ghci med dator> ghci Kompilera med ghc Hugs98: en etablerad interaktiv interpretator

Enkla beräkningar med ghci dator> ghci Prelude> 2*3 6 Prelude> not True False Prelude> True False True Prelude> not (2>3) True Prelude> a == a True Prelude> 42/17 2.47058823529412 Prelude> 42 div 17 ERROR Cannot infer Prelude> div 42 17 2 Prelude> 42 div 17 2 Prelude> mod 9 2 2

Haskell. Typer och dess värden Typ Bool Int Integer Float Double Char String Värde True, False -(2^31) till (2^31)-1 Godtyckligt stora heltal 32 bitar 64 bitar a, 9, \n Haskell

Haskell: grunder i kort Kommentar resten av raden med: -- bortkommenterar resten av raden Kommentarer över flera rader med: {- -} {- Det här är en kommentar -} Namn (parametrar, funktioner) börjar med gemen Ex. minfunktion Värden (symboler) börjar med versaler. Ex: True Funktionsanrop utan parenteser Ex: f(3) skrivs f 3

Herons formel Arean, A för en triangel med sidorna a, b, c är: A = p (p a) (p b) (p c) där p = (a+b+c)/2 I Haskell: area a b c = sqrt(p*(p-a)*(p-b)*(p-c)) where p = (a+b+c)/2

where och let Uttrycket area a b c = sqrt(p*(p-a)*(p-b)*(p-c)) where p = (a+b+c)/2 kan ersättas med area a b c = let p = (a+b+c)/2 in sqrt(p*(p-a)*(p-b)*(p-c))

Upprepning Hur kan vi beräkna summan av kvadraterna: dvs kvadrat_summa= N k=1 k 2 kvadrat_summa= 1 2 + 2 2 + + N 2

Iteration Imperativ stil använder iteration liknande: del_program kvadrat_summa (n) resultat= 0 k = 1 loopa så länge k<=n resultat = resultat + k*k k = k + 1 returnera resultat

Iteration, fortsättning Här utnyttjas minnesutrymmen som kallas resultat respektive k för att lagra delresultat från beräkningarna som utförs i loopens steg. I iterationen har vi inte bara möjlighet att lagra ett värde i ett minnesutrymme utan även att tilldela det ett värde om och om igen.

Rekursion För att upprepa beräkningar kan man i matematiken använda rekursion. Grundidén: är vi klara med beräkningarna returnera resultatet i basfallet annars ta ett steg närmare lösningen med hjälp av ett rekursivt anrop. n kk n = 2, n = 1 kk(n 1) + n 2, aaaaaa

Rekursion, scheme (define ks (lambda (n) (if (= n 1) (* n n) (+ (ks (- n 1)) (* n n)))))

Rekursion, Haskell ks n = if (n == 1) then n*n else ks (n-1) + n*n Funktionen anropas: *Main> ks 3 14 *Main>

Rekursion, beräkningssteg Beräkningsstegen för anropet ks(3): ks 3 ks 2 + 3*3 (ks 1 + 2*2) + 3*3 (1*1 + 2*2) + 3*3 5+9 14

Observationer If-satsens konstruktion och vad den returnerar Parentes kring (n-1), funkar det utan? För vilka värden på n är funktionen giltig? Vilken typ har indata? Utdata? Kan man begränsa indata? Vad händer vid anropet? Övrigt??

Rekursion, Haskell Information om funktion: *Main> :i ks ks :: (Num a) => a -> a -- Defined at ks.hs Lägg till typsignatur ks :: Integer -> Integer ks n = if (n == 1) then n*n else ks (n-1) + n*n

Svansrekursion Skriv om funktionen så att resultaten av beräkningarna som utförs i varje steg skickas med det rekursiva anropet. Kan vara nödvändigt att införa ytterligare en parameter till funktionen för att lagra resultat. Var noga med att anropa med rätt värden.

Svansrekursion, matematiskt Man kan i matematiken använda det svansrekursiva tänkandet: rrr, n = 1 kkk n, rrr = kkk n 1, rrr + n n, aaaaaa Anropet kss(3,1) kan vi räkna ut enligt: kss(3,1) -> kss(2,10) -> kss(1,14) -> 14 dvs kss(3,1) = 14

Svansrekursivt tänkande, Haskell Lägg till typsignatur kss :: Integer -> Integer -> Integer kss n res = if (n == 1) then res else kss (n-1) (res + n*n) Anropa funktionen, (varför dessa värden?): *Main> kss 3 1 14

Svansrekursion När resultatet av det rekursiva anropet INTE är en operand till en operation kan man tala om svansrekursion. Svans-/rekursion ersätter loop i t.ex. imperativa språk. Känns igen av moderna kompilatorer/interpretatorer

Funktion igen Funktion som testar om ett tecken är en siffra: isdigit :: Char -> Bool isdigit c = c >= 0 && c <= 9

Vakter (guarded expressions) I matematiken x, x > 0 aaa x = x, aaaaaa I Haskell abs x x>0 = x otherwise = -x

Vakt och mönstermatchning Kvadratsummeberäkning med vakt: ksv n n == 1 = 1 otherwise = ksv (n-1) + n*n Kvadratsummeberäkning med mönstermatchning: ksm 1 = 1 ksm n = ksm (n-1) + n*n

Layout-regeln Syskon-uttryck står under varandra f a b c = a + d + e where d = b^3 e = c^4 OBS! Indentering

Rekursion (upprepning) Hur kan vi beräkna den harmoniska serien? haaa_sssss = k=1 1/x k