F11 - Rekursion. ID1004 Objektorienterad programmering Fredrik Kilander

Relevanta dokument
Rekursion. Koffman & Wolfgang kapitel 5

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 11: Rekursion

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

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

Föreläsning 13. Rekursion

Föreläsning 6. Rekursion och backtracking

Lösningsförslag till tentamen Datastrukturer, DAT037,

F5 Selektion och iteration. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 6. Rekursion och backtracking

Föreläsning 1, vecka 7: Rekursion

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

Lösningsförslag till exempeltenta 1

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

Tentamen, EDA501/EDAA20 Programmering M MD W BK L

Rekursion och induktion för algoritmkonstruktion

TDDC30. Kursledning Kursledare: Jonas Lindgren. Labassistent: Jonas Lindgren Labassistent: Niklas Holma Labassistent: Erik Nilsson

if (n==null) { return null; } else { return new Node(n.data, copy(n.next));

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren att du har förstått dessa även om detaljer kan vara felaktiga.

Det är principer och idéer som är viktiga. Skriv så att du övertygar rättaren om att du har förstått dessa även om detaljer kan vara felaktiga.

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

Tentamen Programmeringsteknik II Inledning. Anmälningskod:

Tentamen Datastrukturer, DAT037 (DAT036)

String [] argv. Dagens Agenda. Mer om arrayer. Mer om arrayer forts. String [] argv. argv är variabelnamnet. Arrayer och Strängar fortsättning

F12 - Collections. ID1004 Objektorienterad programmering Fredrik Kilander

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å

Tentamen, Algoritmer och datastrukturer

Exempel: Förel Rekursion III Nr 14. Uno Holmer, Chalmers,

Det finns en referensbok (Java) hos vakten som du får gå fram och läsa men inte ta tillbaka till bänken.

F4 Klasser och Metoder. ID1004 Objektorienterad programmering Fredrik Kilander

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

Föreläsning REPETITION & EXTENTA

Objektorienterad programmering E. Back to Basics. En annan version av printtable. Ett enkelt exempel. Föreläsning 10

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

732G Linköpings universitet 732G11. Johan Jernlås. Översikt. Repetition. Muddy. Funktioner / metoder. Punktnotation. Evalueringsordning

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

Lösningsförslag till omtentamen för TDA540 Objektorienterad Programmering

Linjärt minne. Sammanhängande minne är ej flexibelt. Effektivt

JAVAUTVECKLING LEKTION 4

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

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

Grundläggande datalogi - Övning 3

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

OOP Objekt-orienterad programmering

Föreläsning 6: Introduktion av listor

Föreläsning 9 Datastrukturer (DAT037)

TENTAMEN: Algoritmer och datastrukturer. Läs detta! Uppgifterna är inte avsiktligt ordnade efter svårighetsgrad.

Inlämningsuppgift MiniPlotter

Tentamen ID1004 Objektorienterad programmering December 15, 2012

Dagens program. Programmeringsteknik och Matlab. Objektorienterad programmering. Vad är vitsen med att ha både metoder och data i objekten?

Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Föreläsning 12: Exempel och problemlösning

Grundkurs i programmering, 6 hp (725G61) Dugga 2 tillfälle 2

Lösningsförslag. Programmeringsmetodik, KV: Java och OOP. 17 januari 2004

Tentamen Programmeringsteknik II Skrivtid: Hjälpmedel: Java-bok (vilken som helst) Skriv läsligt! Använd inte rödpenna!

Objektorienterad programmering. Fält som funktionsresultat. Mer om fält: att uppdatera ett parameterfält. Kontrast: Parametrar av primitiv typ

Tentamen, EDAA10 Programmering i Java

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

Tentamen OOP

Idag. Javas datatyper, arrayer, referenssemantik. Arv, polymorfi, typregler, typkonvertering. Tänker inte säga nåt om det som är likadant som i C.

Tentamen Programmeringsteknik II och NV2 (alla varianter) Skriv bara på framsidan av varje papper.

F4. programmeringsteknik och Matlab

TENTAMEN OOP

Rekursion: varför? Problem delas upp i mindre bitar algoritm för att lösa problemet erhålls från problemformuleringen

Föreläsning 8: Exempel och problemlösning

Att skriva till och läsa från terminalfönstret

Föreläsning 3-4 Innehåll

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

Föreläsning 7. Träd och binära sökträd

Lösningsförslag till tentamen i EDA011, lördagen den 16 december 2006

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 4 Erik Nilsson, Institutionen för Datavetenskap, LiU

Trädstrukturer och grafer

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

Sökning och sortering

Avbildningar och hashtabeller. Koffman & Wolfgang kapitel 7, mestadels avsnitt 2 4

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

Dagens text. Programmeringsteknik. Mer om Scanner-klassen. Dialogrutor (klassen JOptionPane) Bubbelsortering. Omslagsklasser.

Instuderingsfrågor, del D

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.

Dugga Datastrukturer (DAT036)

Föreläsning Datastrukturer (DAT036)

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 1 Jonas Lindgren, Institutionen för Datavetenskap, LiU

Lösningsförslag till tentamen

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

Länkade strukturer, parametriserade typer och undantag

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

Examination i. PROGRAMMERINGSTEKNIK F1/TM1 TIN212 (Dugga) Dag: Onsdag Datum: Tid: (OBS 3 tim) Rum: V

Tentamen ID1004 Objektorienterad programmering October 29, 2013

Enum, mer om Arv, Abstrakta klasser, Polymorfism, Recursion! Förelasning 14!! TDA540 Objektorienterad Programmering!

Parallellism, återblick

TDDC30. Objektorienterad programmering i Java, datastrukturer och algoritmer. Föreläsning 8 Erik Nilsson, Institutionen för Datavetenskap, LiU

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

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

Anmälningskod: Lägg uppgifterna i ordning. Skriv uppgiftsnummer (gäller B-delen) och din kod överst i högra hörnet på alla papper

TENTAMEN I DATASTRUKTURER OCH ALGORITMER DVG B kl. 14:00-19:00

Tänk på följande: Det finns en referensbok (Java) hos tentavakten som du får gå fram och läsa men inte ta tillbaka till bänken.

Tentamen i Algoritmer & Datastrukturer i Java

Lite om felhantering och Exceptions Mer om variabler och parametrar Fält (eng array) och klassen ArrayList.

Grundkurs i programmering, 6 hp (725G61) Dugga 1 tillfälle 3

F6 Objektorienterad design. ID1004 Objektorienterad programmering Fredrik Kilander

Transkript:

F11 - Rekursion ID1004 Objektorienterad programmering Fredrik Kilander fki@kth.se

Rekursion Rekursion är en programmeringsteknik En metod anropar sig själv public String reverse (String s) { if (s.length() == 1) { return s; else { return reverse(s.substring(1)) + s.substring(0, 1); abc.substring(1) bc abc.substring(0,1) a

Rekursion Rekursion är en programmeringsteknik En metod anropar sig själv En rekursiv metod gör tre saker: kontrollerar om det finns ett enkelt svar (stoppvillkor) gör en del av arbetet anropar sig själv för att göra resten

Rekursion Rekursion är en programmeringsteknik En metod anropar sig själv public String reverse (String s) { if (s.length() == 1) { Stoppvillkor return s; En del av arbetet else { return reverse(s.substring(1)) + s.substring(0, 1); Resten av arbetet abc.substring(1) bc abc.substring(0,1) a

Rekursion är iteration (loop) Istället för for, while eller do så används upprepade anrop till den egna metoden Varje anrop förminskar problemet lite grand Till slut finns bara enkla svar Ett enkelt svar kan lösas utan rekursion Rekursionen når då sitt stoppvillkor

Rekursiva definitioner dekoration: s. ett ornament eller utsmyckning som används för att dekorera med A List is a: number or a number comma List 3 12, 15 22, 1, -45, 3, 3, 91

Oändlig rekursion == oändlig loop rekursion: s. se rekursion Stoppvillkor är nödvändigt Stoppvillkoren måste vara heltäckande

ändlig rekursion == ändlig loop rekursion: s. antingen finns ett enkelt svar, eller så kan ett delsvar hittas och resten av svaret fås med rekursion över det resterande problemet. Stoppvillkor är nödvändigt Stoppvillkoren måste vara heltäckande

Fakultetsfunktionen 0! = 1 1! = 1 2! = 2 * 1 3! = 3 * 2 * 1 n! = n * (n-1)! public int fac(int n) { if (n <= 1) { return 1; else { return n * fac(n-1);

Fakultetsfunktionen! 0! = 1 1! = 1 2! = 2 * 1 3! = 3 * 2 * 1 n! = n * (n-1)! stoppvillkor public int fac(int n) { if (n <= 1) { return 1; else { return n * fac(n-1); dellösning rekursion

Summafunktionen sum(1) = 1 sum(2) = 2 + 1 sum(3) = 3 + 2 + 1 sum(n) = n+sum(n-1) public int sum(int n) { if (n == 1) { return 1; else { return n + sum(n-1);

Varför rekursion fungerar Parametrar och metodvariabler är lokala Varje metodanrop skapar nya lokala variabler Dessa finns så länge metoden är aktiv int sum(int n) { return (n==1)? n : n + sum(n-1); sum(n=4) sum(n=3) sum(n=4) sum(n=2) sum(n=3) sum(n=4) sum(n=1) sum(n=2) sum(n=3) sum(n=4) 1 sum(n=2) sum(n=3) sum(n=4) 3 sum(n=3) sum(n=4) 6 sum(n=4) sum(4) 10

Rekursion vs explicit iteration Rekursion ger ibland elegantare lösningar public int sum(int n) { int summa = 0; for (int i = 1; i <= n; i++) { summa = summa + i; return summa; public int sum(int n) { return (n==1)? 1 : n + sum(n-1);

Indirekt rekursion Metod foo(..) anropar bar(..) bar(..) anropar xyzzy(..) xyzzy(..) anropar foo(..) foo() bar() xyzzy() foo() bar() xyzzy() foo() bar() xyzzy()

Sökning i en labyrint Labyrinten är en matris av int private int[][] grid = { {1,1,1,0,1,1,0,0,0,1,1,1,1, {1,0,1,1,1,0,1,1,1,1,0,0,1, {0,0,0,0,1,0,1,0,1,0,1,0,0, {1,1,1,0,1,1,1,0,1,0,1,1,1, {1,0,1,0,0,0,0,1,1,1,0,0,1, {1,0,1,1,1,1,1,1,0,1,1,1,1, {1,0,0,0,0,0,0,0,0,0,0,0,0, {1,1,1,1,1,1,1,1,1,1,1,1,1 ; 1 är öppen, 0 är stängd (vägg, kloss) Hitta en väg från 0,0 till 7,12

Sökning i en labyrint Labyrinten är en matris av int start private int[][] grid = { {1,1,1,0,1,1,0,0,0,1,1,1,1, {1,0,1,1,1,0,1,1,1,1,0,0,1, {0,0,0,0,1,0,1,0,1,0,1,0,0, {1,1,1,0,1,1,1,0,1,0,1,1,1, {1,0,1,0,0,0,0,1,1,1,0,0,1, {1,0,1,1,1,1,1,1,0,1,1,1,1, {1,0,0,0,0,0,0,0,0,0,0,0,0, {1,1,1,1,1,1,1,1,1,1,1,1,1 ; 1 är öppen, 0 är stängd (vägg, kloss) Hitta en väg från 0,0 till 7,12 mål

Labyrintalgoritmen Om det finns en väg till utgången från denna cell (rad och kolumn) så måste det också finnas en ej besökt väg till utgången från någon av de närmaste grannarna blockerad 0 0 1 3 redan besökt 1 ej besökt

Labyrintalgoritmen public boolean traverse(int row, int column){ boolean done = false; if (valid(row, column)){ grid[row][column] = TRIED; if (atgoal(row,column)) { done = true; else { done = traverse(row + 1, column); // try down if (!done) done = traverse(row, column+1); // try right if (!done) done = traverse(row-1, column); // try up if (!done) done = traverse(row, column-1); // try left if (done) grid[row][column] = PATH; return done;

Labyrintalgoritmen v2 public boolean traverse(int row, int column){ boolean done = false; if (valid(row, column)){ stoppvillkor grid[row][column] = TRIED; if (atgoal(row,column)) { dellösning done = true; else { done = (traverse(row + 1, column) traverse(row, column+1) rekursion traverse(row-1, column) traverse(row, column-1)); if (done) grid[row][column] = PATH; return done;

Att tänka rekursivt Kan problemet göras mindre i identiska steg? Vilka är stoppvillkoren? Blir koden enklare? Blir koden mer eller mindre förståelig?

Binärsökning private int search (int [] ar, int left, int key, int right) { int index = (left + right) / 2; int value = ar[index]; if (right < left) { return -1; // Not found else if (value == key) { return index; // Found else if (key < value) { return search (ar, left, key, index - 1); else { return search (ar, index + 1, key, right); public int search (int [] ar, int key) { return search(ar, 0, key, ar.length - 1);

Binärsökning private int search (int [] ar, int left, int key, int right) { int index = (left + right) / 2; int value = ar[index]; if (right < left) { return -1; // Not found else if (value == key) { return index; // Found else if (key < value) { return search (ar, left, key, index - 1); else { return search (ar, index + 1, key, right); Stoppvillkor Stoppvillkor Förminska och gör resten av arbetet public int search (int [] ar, int key) { return search(ar, 0, key, ar.length - 1);

Towers of Hanoi Tre pinnar, start, mål och hjälp Uppträdda på varje pinne ligger skivor av olika storlek En mindre skiva måste alltid ligga ovanför en större skiva Bild: http://mathforum.org/mathimages/index.php/image:10_ring_hanoi.jpg

Towers of Hanoi För att flytta ett torn om n skivor givet startpinne, målpinne och hjälppinne Om n=1, flytta direkt till målpinnen annars: flytta tornet n-1 från start till hjälp, mha mål flytta n till målet flytta n-1 från hjälp till mål, mha start Bild: http://mathforum.org/mathimages/index.php/image:10_ring_hanoi.jpg

2 n -1 drag start mål hjälp hjälp mål n-1 flyttat till hjälp 1 2 3 4 Flytta skiva 3 direkt till mål 5 6 7 8

Towers of Hanoi private void movetower(int numdisks, int start, int end, int temp){ if (numdisks == 1) { moveonedisk(start, end); else { movetower(numdisks-1, start, temp, end); moveonedisk(start, end); movetower(numdisks-1, temp, end, start); private void moveonedisk(int start, int end){ System.out.println( Move one disk from + start + to + end);

Rekursion sammanfattning Vissa problem lämpar sig för rekursiv lösning Problemet har en iterativ reduktion Talserie Lista Rekursionens styrka utnyttjas bäst vid navigering i flera dimensioner Labyrint Träd- eller graf

Rekursion sammanfattning Rekursiva lösningar har ofta även en traditionell iterativ lösning Rekursionen tar plats på anropsstacken En rekursiv algoritm kan vara svår att förstå Även om den är elegant

GNU: GNU s Not Unix SLUT PÅ BILDER

Sökning i ett binärt träd Trädet är en riktad, acyklisk graf av noder Varje nod innehåller en sträng och högst två referenser till andra träd Fiona public class Node { String name; Node left, right; left right

Sökning i binärt träd Node search(node node, String key){ if (node!= null) { int comparison = key.compareto(node.name); if (comparison == 0) { return node; else if (comparison < 0) { return search(node.left, key); else { return search(node.right, key); return null; Node names =...; search(names, Fiona ); Dave Erik names Eva public class Node { String name; Node left, right; Fiona Harry Tina

Sökning i binärt träd - OOP Node names =...; names names.search( Fiona ); public class Node { String name; Node left, right; Eva Node search(string key){ int comparison = key.compareto(name); Dave if ((comparison < 0) && (left!= null)) { return left.search(key); else if ((0 < comparison) && (right!= null)) { return right.search(key); else if (comparison == 0) { return this; else { return null; Erik Fiona Harry Tina