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

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

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

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

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

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

Föreläsning 2 Programmeringsteknik och C DD1316

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

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

Introduktion till programmering SMD180. Föreläsning 9: Tupler

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

DD1361 Programmeringsparadigm. Carina Edlund

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

Tentamen i Introduktion till programmering

Grundläggande datalogi - Övning 1

Introduktion till programmering D0009E. Föreläsning 9: Tupler och dictionaries

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

Kurslitteraturen. C-nivå Villkorssatser [kap 8] if & elif & else and & or Loopar [kap 9] for

Introduktion till programmering SMD180. Föreläsning 3: Funktioner

Laboration: Whitebox- och blackboxtesting

Introduktion till programmering SMD180. Föreläsning 12: Klasser och objekt

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

Procedurer och villkor

729G04 Programmering och diskret matematik. Python 2: Villkorssatser, sanningsvärden och logiska operatorer

Programmering I Tobias Wrigstad fredag, 2009 augusti 28

Introduktion till programmering SMD180. Föreläsning 8: Listor

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Inom datalogin brukar man använda träd för att beskriva vissa typer av problem. Om man begränsar sig till träd där varje nod förgrenar sig högst två

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

Föreläsning 10 Datalogi 1 DA2001. Utskrift på skärmen. Syntax. print( Hej ) Hur är det? Hej. print( Hej,end= ) print( Hur är det? ) HejHur är det?

Uppgifter teknik HT17 (uppdaterad v. 40)

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

Alla datorprogram har en sak gemensam; alla processerar indata för att producera något slags resultat, utdata.

Sätt att skriva ut binärträd

Problemlösning och funktioner Grundkurs i programmering med Python

Rekursion. Att tänka rekursivt Att programmera rekursivt i Java Exempel. Programmeringsmetodik -Java 254

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

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

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

Föreläsning 4 Programmeringsteknik DD1310. Felhantering. Syntax. try och except är reserverade ord som används för hantering av exekverings fel.

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

Föreläsning 2 Programmeringsteknik och C DD1316. Programmering. Programspråk

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

Föreläsning 3 Programmeringsteknik och Matlab DD1315. Importering av moduler. randrange

Föreläsning 5-6 Innehåll

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

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

Hur man programmerar. TDDC66 Datorsystem och programmering Föreläsning 3. Peter Dalenius Institutionen för datavetenskap

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

JavaScript del 3 If, Operatorer och Confirm

Föreläsning 2 Programmeringsteknik DD1310. Programmering. Programspråk

Föreläsning 5 Mer om funktioner, villkor

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

Föreläsning 3-4 Innehåll. Diskutera. Metod. Programexempel med metod

Tekniska Högskolan i Linköping Institutionen för Datavetenskap (IDA) Torbjörn Jonsson Plot och rekursion

TDDC74 PROGRAMMERING: ABSTRAKTION OCH MODELLERING VT 2017

Variabler och konstanter

Rekursion och induktion för algoritmkonstruktion

729G74 IT och programmering, grundkurs. Tema 2, Föreläsning 2 Jody Foo,

Föreläsning 3-4 Innehåll

Våra enkla funktioner eller procedurer

Laboration 3 HI1024, Programmering, grundkurs, 8.0 hp

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

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

Föreläsning 9 Innehåll. Söndra och härska. Fibonaccitalen. Söndra och härska. Divide and conquer teknik för att konstruera rekursiva algoritmer.

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

Numeriska Metoder och Grundläggande Programmering för P1, VT2014

Föreläsning 13. Dynamisk programmering

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

Föreläsning 13. Rekursion

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

Hej Då, Karel! Programmering. Vårt första Javaprogram. hh.se/db2004. Java. Grundtyper, variabler och arrayer

Extramaterial till Matematik Y

Pythons standardbibliotek

Funktioner. Linda Mannila

Övningshäfte 2: Induktion och rekursion

Kort om klasser och objekt En introduktion till GUI-programmering i Java

Föreläsning 10. Pekare (Pointers)

Programmeringsteknik med C och Matlab

Kort om programmering i Python

Programmering i C, 7,5 hp

Föreläsning 6: Introduktion av listor

TDIU01 - Programmering i C++, grundkurs

v. 42 Python HT17 En introduktion Oscar Bergqvist

Funktioner forts. F3: Funktioner (kap. 5) Parametrar. findgear.m forts

EDAA20 Programmering och databaser. Mål komprimerat se kursplanen för detaljer. Om att lära sig programmera. Föreläsning 1-2 Innehåll.

Platser för att skriva och testa kod online. Workshop om programmering i matematikkurser, version 0.7 senast sparat

Kodexempel från Programmering 2 Tobias Wrigstad, Ph.D.

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

Ordlistor, filhantering och ut på webben. Linda Mannila

Funktionens deklaration

Grundläggande datalogi - Övning 3

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

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

TDP002 - Imperativ programmering

TATM79: Föreläsning 1 Notation, ekvationer, polynom och summor

Översikt. Varför lära sig detta? Motivering Syntax och semantik Imperativa språkets byggstenar och Python. PL-boken Kap 1 (repetition):

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

Förra gången: Primitiva data

1/15/2013. DD1310/DD1314/DA3009 Programmeringsteknik. Lärandemål... Vilka läser kursen? ...fler lärandemål VARFÖR? Föreläsning 1

Föreläsning 2 Programmeringsteknik och Matlab DD1312. Programspråk. Utskrift på skärmen

Transkript:

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

Retur-värden Funktioner kan både orsaka en effekt och returnera ett resultat. Hittills har vi ej definierat några egna funktioner med resultat, däremot har vi ogenerat använt sådana funktioner: result = math.log( x ) print math.sin( radians ) Egna funktioner med resultat ("fruktbara funktioner") definieras med hjälp av en variant av return-satsen: def area( radius ): temp = math.pi * radius**2 return temp 2

return-satsen return-satsen finns alltså i två varianter: med eller utan retur-värde return return uttryck Båda varianterna avbryter aktuellt funktionsanrop. Kod som därmed aldrig kan exekvera kallas död kod: return -x print "This can never get printed" Det förra exemplet kan skrivas mer kortfattat som def area( radius ): return math.pi * radius**2 3

return-satsen En funktion kan innehålla flera return-satser: def absolutevalue(x): if x < 0: return -x else return x Notera att denna funktion inte innehåller någon död kod! 4

return-satsen En funktion som når slutet av sin kropp returnerar automatiskt None. Betrakta följande funktion: def absolutevalue(x): if x < 0: return -x elif x > 0: return x Definitionen är helt korrekt enligt Python, men antagligen inte det som programmeraren tänkt sig! >>> absolutevalue(0) None 5

Inkrementell programutveckling Hur bygger man större funktioner än våra enkla exempel? Genom att bara "se" lösningen framför sig? Inkrementell programutveckling är en teknik som främjar stegvist byggande och testande av program, en liten detalj i taget Som exempel ska vi försöka implementera följande matematiska formel i Python:! distance = (x2 x1 )2 + (y2 y1 )2 6

Steg 1 Hitta rätt syn på programmet som helhet. Ska programmet utföra en beräkning som vi vill kunna upprepa med olika indata? I så fall pratar vi om att bygga en funktion I vårt fall ska vi beräkna avståndet mellan två punkter. Låt oss kalla funktionen för distance Vad är programmets indata? Dessa blir funktionens parametrar. I vårt fall vill vi kunna köra beräkningen med olika värden på x1, y1, x2 och y2. Funktionens huvud måste alltså bli def distance( x1, y1, x2, y2 ): 7

Steg 1 Eftersom programmets resultat ska vara ett decimaltal kan vi bygga en grov approximation till vår funktion genom att helt enkelt returnera värdet 0.0: def distance( x1, y1, x2, y2 ): return 0.0 Denna funktion är naturligtvis inte en korrekt lösning, men vi kan redan nu testa den för att elliminera eventuella syntaxfel i funktionshuvudet Om Python accepterar koden ska vi kunna köra >>> distance( 1, 2, 4, 6 ) 0.0 8

Steg 2 Här gäller det att identifiera några intressanta delresultat som är enkla att beräkna. I vårt fall är differenserna x2 x1 och y2 y1 lämpliga kandidater Vi fångar dessa delresultat som lokala variabler som vi som en del av testningen skriver ut: def distance( x1, y1, x2, y2 ): dx = x2 - x1 dy = y2 - y1 print "dx is", dx print "dy is", dy return 0.0 9

Steg 2 Vi kan nu testköra igen: >>> distance( 1, 2, 4, 6 ) dx is 3 dy is 4 0.0 Viktig fråga: är denna output den förväntade? Att veta vad programmet borde göra är A och O vid testning Här har vi möjlighet att elliminera typiska slarvfel som att t ex skriva x1 där vi menar x2 10

Steg 3 Vi identifierar ytterligare ett delresultat: summan av de tidigare delresultaten i kvadrat def distance( x1, y1, x2, y2 ): dx = x2 - x1 dy = y2 - y1 dsquared = dx*dx + dy*dy print "dsquared is", dsquared return 0.0 Observera att de tidigare testutskrifterna är borta nu då de inte längre behövs I stället verifierar vi att samma körning som tidigare visar att dsquared får det förväntade värdet (dvs 25) 11

Steg 4 Vi är nu mycket nära en komplett lösning, endast en ny operation behöver utföras på det senaste delresultatet: def distance( x1, y1, x2, y2 ): dx = x2 - x1 dy = y2 - y1 dsquared = dx*dx + dy*dy result = mat.sqrt( dsquared ) return result Här behövs ingen extra testutskrift, i och med att vi testar det slutliga beräkningsresultatet: >>> distance( 1, 4, 2, 6 ) 5.0 12

Tekniken i ett nötskal Skapa ett körbart program redan från början, även om allt väsentligt arbete återstår att göra Använd lokala variabler för delresultat, då blir de enklare att skriva ut vid testning Definiera en uppsättning testexempel där du redan vet vad det förväntade resultatet ska bli Testa varje steg i utvecklingen innan du går vidare När allt fungerar kan koden gärna komprimeras genom att spårutskrifter och tas bort och deluttryck sätts samman till större enheter 13

Sammansatta uttryck Vi har: en funktion som beräknar en cirkels area givet radien en funktion som beräknar avståndet mellan 2 punkter Om vi känner till centrum (xc, yc) av en cirkel och en punkt på kanten (xp, yp) kan vi skriva: radius = distance( xc, yc, xp, yp ) result = area( radius ) Som ett sammansatt uttryck: result = area( distance(xc,yc,xp,yp) ) Hur kan vi göra denna kod lite mer generell? 14

Funktionsinkapsling I stället för att bara anta att indata finns i några variabler, och bara lämna resultatet i en annan variabel, kan vi kapsla in vår beräkning som en funktion: def area2( xc, yc, xp, yp ): result = area( distance(xc,yc,xp,yp) ) return result Observera att namnen xc, yc, xp, yp och result nu är helt lokala de behöver inte kännas till (och kan inte kommas åt) av någon annan del av vårt program Dataflödet in och ut ur funktionen sker i stället helt via argument och returvärde: kalle = area2(i,j,i+1,b+1) 15

Boolska funktioner Funktioner som returnerar sanningsvärden, oftast resultat av tester (ja/nej-frågor): def isdivisible(x, y): if x%y == 0: return True else: return False Kan skrivas mer koncist: def isdivisible(x, y): return x%y == 0 16

Boolska funktioner Typisk användning är i if-satser: if isdivisible(x, y): print "x is divisible by y" else: print "x is not divisible by y" Korrekt, men onödigt krånglig variant: if isdivisible(x, y) == True: print "x is divisible by y" else: print "x is not divisible by y" 17

Djärvt påstående Det vi sett hittills av Python räcker för att uttrycka alla beräkningar som kan utföras av en dator! (variant av Turings tes, 1936) Om detta är sant, vad hände i så fall med byggstenen repetition (kap. 1)? Svar: vi har redan smugit in den byggstenen i och med att funktioner kan anropa varandra rekursivt! En annan fråga är hur bekvämt det är att utrycka saker och ting med endast nuvarande Python-delmängd... här är vårt motiv att fortsätta kursen (trots Alan Turings tes!) Men låt oss titta lite närmare på rekursion igen... 18

Om rekursiva definitioner Rent circulär definition (dvs nonsens): äger (av äga) [v] modeord beskrivande företeelse eller person som äger Meningsfull rekursiv definition: fakultetsfunktionen! 0! = 1 n! = n*(n-1)! Exempel: 3! = 3*2! = 3*2*1! = 3*2*1*0! = 3*2*1*1 = 6 Så varför är detta inte nonsens? Svar: för att det finns ett basfall som inte är cirkulärt! 19

Fakultetsfunktionen i Python I stället för n! srkiver vi i Python factorial(n) def factorial(n): if n==0: return 1 else: recurse = factorial(n-1) result = n * recurse return result Nyhet: en rekursiv funktion som returnerar ett resultat Basfallet identifieras genom att vi testar argumentet n 20

Programflödet för factorial(3) Eftersom n (dvs 3) inte är 0 tar vi else-grenen och beräknar factorial(n-1), dvs factorial(2) Eftersom n (dvs 2) inte är 0 tar vi else-grenen och beräknar factorial(n-1), dvs factorial(1) Eftersom n (dvs 1) inte är 0 tar vi else-grenen och beräknar factorial(n-1), dvs factorial(0) Eftersom n (dvs 0) är 0 tar vi basfallet och returnerar 1 omedelbart Variabeln recurse (som fått värdet 1) multipliceras med n (dvs 1) och resultatet 1 returneras Variabeln recurse (som fått värdet 1) multipliceras med n (dvs 2) och resultatet 2 returneras Variabeln recurse (som fått värdet 2) multipliceras med n (dvs 3) och resultatet 6 returneras 21

factorial(3) som stackdiagram -toplevel6 factorial n 3 recurse 2 result 6 2 factorial n 2 recurse 1 result 2 1 factorial n 1 recurse 1 result 1 1 factorial n 0

I mer kompakt form def factorial(n): if n==0: return 1 else: return n * factorial(n-1) Denna variant är enklare i betydelsen mer koncis, men gör å andra sidan programflödet något svårare att följa Utmaningen är att kunna släppa fokus på programflödet, och börja se funktionsanrop och deras resultat som helt enkelt samma sak att "våga språnget" 23

Den s k Fibonacci-funktionen def fibonacci(n): if n==0 or n==1: return 1 else: return fibonacci(n-1) + fibonacci(n-2) Försök följa programflödet för t ex fibonacci(10), och huvudet börjar snurra... Men om vi i stället vågar språnget kan vi se ett mönster: n: 0 1 2 3 4 5 6 7 8 9 10... fibonacci(n): 1 1 2 3 5 8 13 21 34 55 89... Varje Fibonacci-tal är summan av de två föregående...! 24