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

Relevanta dokument
Procedurer och villkor

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

Idag: Dataabstraktion

Föreläsning 13. Rekursion

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

Datalogi, grundkurs 1

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

TDDC74 Programmering, abstraktion och modellering. Tentamen

Rekursion och induktion för algoritmkonstruktion

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

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

Objektorienterad programmering

Pythons standardbibliotek

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.

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

Föreläsning 5. Rekursion

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.

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

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

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

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

Dekomposition och dynamisk programmering

Variabler och konstanter

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

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

Användarhandledning Version 1.2

TDDC74 - Lektionsmaterial C

Tentamen i. TDDA 69 Data och programstrukturer

PROGRAMMERING-Java Omtentamina

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

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

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

Föreläsning 1, vecka 7: Rekursion

Lösning av några vanliga rekurrensekvationer

Transkript:

Procedurer och villkor Rekursiva procedurer (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 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 DA200 (Föreläsning 4) Datalogi Hösten 202 / DA200 (Föreläsning 4) Datalogi Hösten 202 2 / Exempel: n-fakultet Exempel: n-fakultet... Vi vill definiera n-fakultet i Scheme. I matematiken kan n-fakultet definieras på följande sätt: n! = 2... (n ) n Då n är känd, säg lika med 4, kan vi beräkna 4! genom att multiplicera fyra heltal: >(define fyra-fakultet (* 2 3 4)) >fyra-fakultet 24 Då n är lika med 6, kan 6! beräknas på motsvarande sätt: >(define sex-fakultet (* 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 (* 2... (- n ) n)) DA200 (Föreläsning 4) Datalogi Hösten 202 3 / DA200 (Föreläsning 4) Datalogi Hösten 202 4 /

Exempel: n-fakultet... Exempel: n-fakultet... Vi använder istället en annan matematisk definition av n!: n! = som definierar n! med hjälp av (n )! { om n = 0 (basfall) n (n )! om n > 0 För att beräkna n! multiplicerar vi n med det vi får vid beräkning av (n )!, för att beräkna (n )! multiplicerar vi n med det vi får vid beräkning av (n 2)!,... tills vi kommer till 0!, som enligt basfallet är lika med. 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) (* n (factorial (- n )))))) 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 DA200 (Föreläsning 4) Datalogi Hösten 202 5 / DA200 (Föreläsning 4) Datalogi Hösten 202 6 / 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:. (factorial 4) 2. (if (= 4 0) (* 4 (factorial (- 4 )))) 3. (* 4 (factorial 3)) 4. (* 4 (if (= 3 0) (* 3 (factorial (- 3 ))))) (* 3 (factorial (- 3 ))))) 5. (* 4 (* 3 (factorial 2))) 6. (* 4 (* 3 (if (= 2 0) (* 2 (factorial (- 2 )))))) 7. (* 4 (* 3 (* 2 (factorial )))) 8. (* 4 (* 3 (* 2 (if (= 0) (* (factorial (- ))))))) 9. (* 4 (* 3 (* 2 (* (factorial 0))))) 0. (* 4 (* 3 (* 2 (* (if (= 0 0) (* (factorial (- )))))))) fullt expanderad:. (* 4 (* 3 (* 2 (* )))) DA200 (Föreläsning 4) Datalogi Hösten 202 7 / DA200 (Föreläsning 4) Datalogi Hösten 202 8 /

. (* 4 (* 3 (* 2 (* )))) så en avvecklingsfas: 2. (* 4 (* 3 (* 2 ))) 3. (* 4 (* 3 2)) 4. (* 4 6) 5. 24 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: DA200 (Föreläsning 4) Datalogi Hösten 202 9 / DA200 (Föreläsning 4) Datalogi Hösten 202 0 / Mer exempel på rekursion >(trace factorial) >(factorial 4) expansions-fas: [factorial 4] [factorial 3] [factorial 2] [factorial ] [factorial 0] avvecklings-fas: 2 6 24 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å:. 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 > tal. I så fall är n = det sökta talet. 3. Annars, testa om bas 2 > tal. I så fall är det n = 2 vi söker. 4.... DA200 (Föreläsning 4) Datalogi Hösten 202 / DA200 (Föreläsning 4) Datalogi Hösten 202 2 /

Mer exempel på rekursion... Felsökning 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 ))))) 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 ] [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 DA200 (Föreläsning 4) Datalogi Hösten 202 3 / DA200 (Föreläsning 4) Datalogi Hösten 202 4 / 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 ) b 0 = Detta kan översättas till schemeproceduren: (define expt- (lambda (b n) (if (= n 0) (* b (expt- b (- n )))))) Gör vi trace på expt- så får vi följande utskrift: DA200 (Föreläsning 4) Datalogi Hösten 202 5 / DA200 (Föreläsning 4) Datalogi Hösten 202 6 /

> (trace expt-) (expt-) > (expt- 2 4) [expt- 2 4] [expt- 2 3] [expt- 2 2] [expt- 2 ] [expt- 2 0] 2 4 8 6 6 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. DA200 (Föreläsning 4) Datalogi Hösten 202 7 / DA200 (Föreläsning 4) Datalogi Hösten 202 8 / En alternativ definition av exponentberäkningen: Nu får vi följande utskrift: (define expt-2 (lambda (b n) (expt-2-svans b n ))) (define expt-2-svans (lambda (b n res) (if (= n 0) res (expt-2-svans (- n ) (* b res))))) (trace expt-2-svans) > (expt-2 2 4) [expt-2-svans 2 4 ] [expt-2-svans 2 3 2] [expt-2-svans 2 2 4] [expt-2-svans 2 8] [expt-2-svans 2 0 6] 6 6 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. DA200 (Föreläsning 4) Datalogi Hösten 202 9 / DA200 (Föreläsning 4) Datalogi Hösten 202 20 /

Factorial definierades rekursivt, men kan naturligtvis få en svansrekursiv definition: (define fac-2 (lambda (n) (fac-2-svans n 2 ))) (define fac-2-svans (lambda (n m res) (if (> m n) res (fac-2-svans n (+ m ) (* res m))))) (trace fac-2-svans) >(fac-2 5) [fac-2-svans 5 2 ] [fac-2-svans 5 3 2] [fac-2-svans 5 4 6] [fac-2-svans 5 5 24] [fac-2-svans 5 6 20] 20 20 Den svansrekursiva proceduren ger upphov till en iterativ process. DA200 (Föreläsning 4) Datalogi Hösten 202 2 / DA200 (Föreläsning 4) Datalogi Hösten 202 22 / Rekursiv procedur rekursiv process (define add- (lambda (a b) (if (= a 0) b (+ (add- (- a ) b))))) [add- 3 4] [add- 2 4] [add- 4] [add- 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 Rekursiv procedur iterativ process (define add-2 (lambda (a b) (if (= a 0) b (add-2 (- a ) (+ b ))))) [add-2 3 4] [add-2 2 5] [add-2 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 DA200 (Föreläsning 4) Datalogi Hösten 202 23 / DA200 (Föreläsning 4) Datalogi Hösten 202 24 /

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 DA200 (Föreläsning 4) Datalogi Hösten 202 25 /