Procedurer och villkor

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

Förra gången: Primitiva data

I dag: Blockstruktur, omgivningar, problemlösning

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

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

Föreläsning 9 Exempel

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

DD1361 Programmeringsparadigm. Carina Edlund

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

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

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

Våra enkla funktioner eller procedurer

TDDC74 Programmering, abstraktion och modellering DUGGA 1

1 3H 0 2gre ordningens procedurer

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

Föreläsning 13. Rekursion

Idag: Dataabstraktion

TDDC74 PROGRAMMERING: ABSTRAKTION OCH MODELLERING VT 2017

Språket Scheme. DAT 060: Introduktion till (funktions)programmering. DrScheme. uttryck. Jacek Malec m. fl. evaluering av uttryck.

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

TDDC74 Programmering, abstraktion och modellering. Tentamen

TDDC74 Programmering, abstraktion och modellering DUGGA 2

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

Datalogi, grundkurs 1

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

TDDC74 Programmering, abstraktion och modellering. Tentamen

Rekursion och induktion för algoritmkonstruktion

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

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

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 27 augusti 2016, kl 8 12

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

TDDC74 Lab 04 Muterbara strukturer, omgivningar

TDDC74 Programmering, abstraktion och modellering. Tentamen

TDDC74 Programmering: Abstraktion och modellering Tentamen, onsdag 9 juni 2016, kl 14 18

Datalogi, grundkurs 1

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

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

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

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)

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

Datalogi, grundkurs 1

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

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

TDDC74 Programmering: Abstraktion och modellering Dugga 1, kl 14-16

Pythons standardbibliotek

Objektorienterad programmering

Rekursion. Koffman & Wolfgang kapitel 5

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

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

Programkonstruktion och Datastrukturer

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

Omgivningar. Omgivningar är viktiga eftersom de avgör vilka namn som är synliga och därmed dessas innebörd och de värden som är förknippade med dem.

Föreläsning 5. Rekursion

Idag: Dataabstraktion

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

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

MMA132: Laboration 2 Matriser i MATLAB

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

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

Tentamen i kurserna Beräkningsmodeller (TDA181/INN110) och Grundläggande Datalogi (TDA180)

TDDC74 Programmering, abstraktion och modellering. Tentamen

Föreläsning 5. Rekursion

Föreläsning 11: Rekursion

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

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

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

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

TDDC74 Programmering: Abstraktion och modellering Tentamen, lördag 29 augusti 2015, kl 8 12

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

Funktionens deklaration

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

Objektorienterad programmering Föreläsning 8. Copyright Mahmud Al Hakim Agenda (halvdag)

Föreläsning 6: Introduktion av listor

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

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

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

Programmering II (ID1019)

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

public static void mystery(int n) { if (n > 0){ mystery(n-1); System.out.print(n * 4); mystery(n-1); } }

Rekursion och induktion för algoritmkonstruktion

Summera godtyckligt antal tal. Programkonstruktion. Moment 4 Om rekursion. Fullständigt resonemang för summeringen. Analys av summeringsproblemet

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

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

Dekomposition och dynamisk programmering

Tentamen i. TDDA 69 Data och programstrukturer

Variabler och konstanter

TDDC74 Programmering: Abstraktion och modellering Dugga 1, exempeldugga

TDDC74 Lab 02 Listor, sammansatta strukturer

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

Inlämningsuppgift MiniPlotter

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

Rekursion och induktion för algoritmkonstruktion

Programkonstruktion och datastrukturer. Moment 9 Om högre ordningens funktioner. PKD 2010/11 moment 9 Sida 1 Uppdaterad

Användarhandledning Version 1.2

Tommy Färnqvist, IDA, Linköpings universitet

TDDC74 - Lektionsmaterial C

PROGRAMMERING-Java Omtentamina

Programmering C: Tentamen of 5 Prioritet och associativitet hos operatorerna i C De viktigaste operatorerna: Prioritet Kategori Operator

Föreläsning 1, vecka 7: Rekursion

Transkript:

Procedurer och villkor (define lessorequal (lambda (x y) (or (< x y) (= x y)))) (define between (lambda (x y z) (and (lessorequal x y) (lessorequal y z)))) > (between 3 4 5) #t > (between 3 2 5) #f DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 1 / 1

Rekursiva procedurer Vad är en rekursiv procedur? Hur beräknas en rekursiv procedur? Hur definieras en rekursiv procedur? Mera rekursiva procedurer Svansrekursion Bra om du åtminstone skummat igenom i AS: Example: Square Roots by Newton s Method samt Procedures as Black-Box Abstractions Procedures and the Processes They Generate Linear Recursion and Iteration Tree Recursion DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 2 / 1

Exempel: n-fakultet Vi vill definiera n-fakultet i Scheme. I matematiken kan n-fakultet definieras på följande sätt: n! = 1 2... (n 1) n Då n är känd, säg lika med 4, kan vi beräkna 4! genom att multiplicera fyra heltal: >(define fyra-fakultet (* 1 2 3 4)) >fyra-fakultet 24 DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 3 / 1

Exempel: n-fakultet... Då n är lika med 6, kan 6! beräknas på motsvarande sätt: >(define sex-fakultet (* 1 2 3 4 5 6)) >sex-fakultet 720 Hur definierar vi en procedur för n-fakultet då n inte är konstant? Vi kan inte förkorta ett Scheme-uttryck med... : >(define n-fakultet (* 1 2... (- n 1) n)) DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 4 / 1

Exempel: n-fakultet... Vi använder istället en annan matematisk definition av n!: n! = { 1 om n = 0 (basfall) n (n 1)! om n > 0 som definierar n! med hjälp av (n 1)! För att beräkna n! multiplicerar vi n med det vi får vid beräkning av (n 1)!, för att beräkna (n 1)! multiplicerar vi n 1 med det vi får vid beräkning av (n 2)!,... tills vi kommer till 0!, som enligt basfallet är lika med 1. DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 5 / 1

Exempel: n-fakultet... En Scheme-procedur som utför ovanstående beräkningssteg definieras nära nog exakt som den ovanstående matematiska definitionen: >(define factorial (lambda (n) (if (= n 0) 1 (* n (factorial (- n 1)))))) Factorial är en rekursiv procedur eftersom procedurkroppen till factorial innehåller ett anrop av factorial själv. Anropet inuti procedurkroppen kallas ett rekursivt anrop. Att använda factorial: >(factorial 4) 24 DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 6 / 1

Hur beräknas en rekursiv procedur? Generellt sett, så använder man rekursiva procedurer för att utföra en sekvens av upprepade beräkningar, men hur sker beräkningen? Genom att använda substitutionsmodellen, får vi följande beräkningssteg: Först expansionsfasen: 1. (factorial 4) 2. (if (= 4 0) 1 (* 4 (factorial (- 4 1)))) 3. (* 4 (factorial 3)) 4. (* 4 (if (= 3 0) 1 (* 3 (factorial (- 3 1))))) DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 7 / 1

Hur beräknas en rekursiv procedur?... (* 3 (factorial (- 3 1))))) 5. (* 4 (* 3 (factorial 2))) 6. (* 4 (* 3 (if (= 2 0) 1 (* 2 (factorial (- 2 1)))))) 7. (* 4 (* 3 (* 2 (factorial 1)))) 8. (* 4 (* 3 (* 2 (if (= 1 0) 1 (* 1 (factorial (- 1 1))))))) 9. (* 4 (* 3 (* 2 (* 1 (factorial 0))))) 10. (* 4 (* 3 (* 2 (* 1 (if (= 0 0) 1 (* 1 (factorial (- 1 1)))))))) fullt expanderad: 11. (* 4 (* 3 (* 2 (* 1 1)))) DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 8 / 1

Hur beräknas en rekursiv procedur?... 11. (* 4 (* 3 (* 2 (* 1 1)))) så en avvecklingsfas: 12. (* 4 (* 3 (* 2 1))) 13. (* 4 (* 3 2)) 14. (* 4 6) 15. 24 DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 9 / 1

Hur beräknas en rekursiv procedur?... Under expansionsfasen blir uttrycket normalt större och större (eller längre och längre) via substitutionerna. Under avvecklingsfasen blir uttrycket normalt mindre och mindre (eller kortare och kortare). För vissa rekursiva procedurer kan expansionsfasen och avvecklingsfasen falla samman. För att se expansionsfasen och avvecklingsfasen för rekursiva procedurer på skärmen, använd trace: DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 10 / 1

Hur beräknas en rekursiv procedur?... >(trace factorial) >(factorial 4) expansions-fas: [factorial 4] [factorial 3] [factorial 2] [factorial 1] [factorial 0] avvecklings-fas: 1 1 2 6 24 DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 11 / 1

Mer exempel på rekursion Gör en procedur som givet två argument, bas och tal, ger det minsta naturliga talet n så att bas n > tal. Detta kan beräknas så: 1. Testa först om bas 0 > tal. Om villkoret är uppfyllt, så är 0 det n vi söker eftersom 0 är det minsta naturliga talet. 2. Annars, testa om bas 1 > tal. I så fall är n = 1 det sökta talet. 3. Annars, testa om bas 2 > tal. I så fall är det n = 2 vi söker. 4.... DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 12 / 1

Mer exempel på rekursion... Denna beräkningssekvens fortsätter tills vi hittat ett n så att bas n > tal. Det funna värdet på n returneras som resultat. I Scheme kan vi definiera en rekursiv procedur som utför ovanstående beräkning. (define power-close-to (lambda (bas tal n) (if (> (expt bas n) tal) n (power-close-to bas tal (+ n 1))))) DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 13 / 1

Felsökning Använd trace för att se vilka argumentvärden som används och vilka värden som returneras i mellanstegen. >(trace power-close-to) >(power-close-to 4 80 0) [power-close-to 4 80 0] [power-close-to 4 80 1] [power-close-to 4 80 2] [power-close-to 4 80 3] [power-close-to 4 80 4] 4 >(untrace power-close-to) >(power-close-to 4 80 0) 4 DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 14 / 1

Svansrekursion För att utföra exponentberäkningar av typen b n, där n är ett positivt heltal, kan följande rekursiva definition användas: b n = b b (n 1) b 0 = 1 DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 15 / 1

Svansrekursion... Detta kan översättas till schemeproceduren: (define expt-1 (lambda (b n) (if (= n 0) 1 (* b (expt-1 b (- n 1)))))) Gör vi trace på expt-1 så får vi följande utskrift: DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 16 / 1

Svansrekursion... > (trace expt-1) (expt-1) > (expt-1 2 4) [expt-1 2 4] [expt-1 2 3] [expt-1 2 2] [expt-1 2 1] [expt-1 2 0] 1 2 4 8 16 16 DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 17 / 1

Svansrekursion... Multiplikationerna görs efter de rekursiva anropen. Innan multiplikationerna börjar beräknas, växer uttrycket på grund av de rekursiva anropen. Detta gör att mer minnesuttrymme krävs ju fler rekursiva anrop som utförs. DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 18 / 1

Svansrekursion... En alternativ definition av exponentberäkningen: (define expt-2 (lambda (b n) (expt-2-svans b n 1))) (define expt-2-svans (lambda (b n res) (if (= n 0) res (expt-2-svans (- n 1) (* b res))))) (trace expt-2-svans) DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 19 / 1

Svansrekursion... Nu får vi följande utskrift: > (expt-2 2 4) [expt-2-svans 2 4 1] [expt-2-svans 2 3 2] [expt-2-svans 2 2 4] [expt-2-svans 2 1 8] [expt-2-svans 2 0 16] 16 16 Multiplikationerna görs samtidigt som rekursiva anropen, vilket gör uttrycken i mellanstegen inte växer. Inget extra minnesutrymme krävs för de rekursiva anropen. Sådana rekursiva procedurer kallas för svansrekursiva procedurer. DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 20 / 1

Svansrekursion... Factorial definierades rekursivt, men kan naturligtvis få en svansrekursiv definition: (define fac-2 (lambda (n) (fac-2-svans n 2 1))) (define fac-2-svans (lambda (n m res) (if (> m n) res (fac-2-svans n (+ m 1) (* res m))))) (trace fac-2-svans) DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 21 / 1

Svansrekursion... >(fac-2 5) [fac-2-svans 5 2 1] [fac-2-svans 5 3 2] [fac-2-svans 5 4 6] [fac-2-svans 5 5 24] [fac-2-svans 5 6 120] 120 120 Den svansrekursiva proceduren ger upphov till en iterativ process. DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 22 / 1

Svansrekursion... Rekursiv procedur rekursiv process (define add-1 (lambda (a b) (if (= a 0) b (+ 1 (add-1 (- a 1) b))))) [add-1 3 4] [add-1 2 4] [add-1 1 4] [add-1 0 4] 4 5 6 7 Tänk: Proceduren är inte svansrekursiv eftersom den utför en beräkning på resultatet av det rekursiva anropet DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 23 / 1

Svansrekursion... Rekursiv procedur iterativ process (define add-2 (lambda (a b) (if (= a 0) b (add-2 (- a 1) (+ b 1))))) [add-2 3 4] [add-2 2 5] [add-2 1 6] [add-2 0 7] 7 Tänk: Proceduren är svansrekursiv eftersom den inte utför någon beräkning på resultatet av det rekursiva anropet DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 24 / 1

Nästa gång: Kan man definiera variabler och procedurer så att de är dolda? Kan man gömma dem? Vi ska titta lite på Blockstrukturer Omgivningar Enkel problemlösning Läs gärna i AS: Example: Square Roots by Newton s Method samt Procedures as Black-Box Abstractions DA2001 (Föreläsning 4) Datalogi 1 Hösten 2012 25 / 1