Föreläsning 13. Rekursion

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

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

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

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

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

Rekursion och induktion för algoritmkonstruktion

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

Rekursion. Koffman & Wolfgang kapitel 5

Föreläsning 11 Datastrukturer (DAT037)

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

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

Rekursion och induktion för algoritmkonstruktion

Procedurer och villkor

Rekursion och induktion för algoritmkonstruktion

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

Föreläsning 6: Introduktion av listor

F11 - Rekursion. ID1004 Objektorienterad programmering Fredrik Kilander

Föreläsning 5. Rekursion

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

Föreläsning 6. Rekursion och backtracking

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

Algoritmanalys. Inledning. Informationsteknologi Malin Källén, Tom Smedsaas 1 september 2016

Magnus Nielsen, IDA, Linköpings universitet

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

Tentamen'('Datastrukturer,'algoritmer'och'programkonstruktion.'

Föreläsning 11: Rekursion

Föreläsning 1, vecka 7: Rekursion

Föreläsning 8 Innehåll

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.

Grundläggande datalogi - Övning 3

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

Funktionell programmering DD1361

Föreläsning 11 Innehåll

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

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

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 6. Rekursion och backtracking

Lösning av några vanliga rekurrensekvationer

Programmering för språkteknologer II, HT2014. Rum

Tommy Färnqvist, IDA, Linköpings universitet

Algoritmer, datastrukturer och komplexitet

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

Datastrukturer D. Föreläsning 2

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

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

Sökning och sortering

Sortering. Brute-force. Sortering Ordna element enligt relation mellan nyckelvärden

Föreläsning 12 Innehåll

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

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Algoritmer, datastrukturer och komplexitet

Klassen BST som definierar binära sökträd med tal som nycklar och enda data. Varje nyckel är unik dvs förekommer endast en

Tentamen Datastrukturer (DAT037)

Föreläsning 2 Datastrukturer (DAT037)

Lösningsförslag till exempeltenta 1

Föreläsning 5. Rekursion

Föreläsning 4. Kö Implementerad med array Implementerad med länkad lista Djup kontra bredd Bredden först mha kö

Föreläsning 12 Innehåll

4 13 / %.; 8 </" '': " / //&' " " ' * TelefonKostnad +,-%&. #!" $% " &' . > / ' 5 /' * 13/ &' static Math 1+" &'/ % 12 "" static "' * 1 /") %& &

TDDC74 Lab 02 Listor, sammansatta strukturer

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

Medan ni väntar. 2. Skriv metoden. 3. Skriv metoden. Naturligtvis rekursivt och utan användning av Javas standardmetoder.

F9 - Polymorfism. ID1004 Objektorienterad programmering Fredrik Kilander

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

Översikt. Stegvis förfining. Stegvis förfining. Dekomposition. Algoritmer. Metod för att skapa ett program från ett analyserat problem

Föreläsning 3-4 Innehåll

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.

Teoretisk del. Facit Tentamen TDDC kl (6) 1. (6p) "Snabba frågor" Alla svar motiveras väl.

Föreläsning REPETITION & EXTENTA

Föreläsning 9 Datastrukturer (DAT037)

Datastrukturer. föreläsning 2

Föreläsning 2 Objektorienterad programmering DD1332. Typomvandling

Sätt att skriva ut binärträd

Dekomposition och dynamisk programmering

Inlämningsuppgift MiniPlotter

Algoritmer, datastrukturer och komplexitet

Objektorienterad programmering

Lösningar Datastrukturer TDA

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

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

Länkade strukturer, parametriserade typer och undantag

Programkonstruktion och Datastrukturer

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

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

public interface Skrivbar { void skriv(); } public class Punkt implements Skrivbar { public double x; public double y;

Objektorienterad programmering E. Algoritmer. Telefonboken, påminnelse (och litet tillägg), 1. Telefonboken, påminnelse (och litet tillägg), 2

Sökning i ordnad lista. Sökning och sortering. Sökning med vaktpost i oordnad lista

DD1320 Tillämpad datalogi. Lösning (skiss) till tenta 20 okt 2011

Grundläggande programmering, STS 1, VT Sven Sandberg. Föreläsning 12

Föreläsning 9. Sortering

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

Dugga Datastrukturer (DAT036)

Lösningsförslag till tentamen Datastrukturer, DAT037,

Rekursiva algoritmer sortering sökning mönstermatchning

Tentamen DE12, IMIT12, SYST12, ITEK11 (även öppen för övriga)

Några saker till och lite om snabbare sortering

Kapitel 7: Analys av sorteringsalgoritmer

Tentamen Datastrukturer (DAT036)

Träd, binära träd och sökträd. Koffman & Wolfgang kapitel 6, avsnitt 1 4

Lösningsförslag till tentamen Datastrukturer, DAT037,

Transkript:

Föreläsning 13 Rekursion

Rekursion En rekursiv metod är en metod som anropar sig själv. Rekursion används som alternativ till iteration. Det finns programspråk som stödjer - enbart iteration (FORTRAN) eller - enbart rekursion (tidiga versioner av LISP). Java stödjer båda. Rekursion är en teknik för att lösa problem som innehåller en eller flera problemdelar av liknande sort men som är lättare att lösa. 2

För att använda rekursion krävs: Ett problem som innehåller ett eller flera delproblem som liknar problemet självt. Ett enkelt fall av problemet som är lätt att lösa (utan rekursion). Detta kallas basfallet. Ett sätt att förenkla problemet så att det kommer närmare basfallet. 3

Två problem som kan lösas med rekursion n-fakultet, n! = n * (n 1) * (n 2) *... * 1 1! = 1 2! = 2 * 1 = 2 3! = 3 * 2 * 1 = 6 4! = 4 * 3 * 2 * 1 = 24... Tornen i Hanoi (lek från 1800-talet av franske matematikern Edouard Lucas). 1) Flytta en ring i taget. 2) Ingen ring får placeras ovanpå en mindre ring. 3) Alla ringar måste flyttas till pinnen till höger. 4

n-fakultet uppfyller kraven för rekursion Problemet ska bestå av en eller flera delproblem som liknar problemet självt: n! består av ett enklare problem, nämligen problemet att beräkna produkten av de n 1 första talen, dvs (n 1)!. Det måste finnas ett basfall av problemet som är enkelt att lösa (dvs utan rekursion): Basfallet kan väljas som 1! = 1. Det måste finnas ett sätt att förenkla problemet så att det kommer närmare basfallet: Man kan på ett enkelt sätt komma från n! till (n 1)!, nämligen genom att inse att n! = n * (n - 1)! 5

n-fakultet i Java-kod //Pre: n >= 1 //Post: resultat = n! public long factorial(int n) { if (n == 1) return 1; else return n * factorial(n 1); factorial(4) 4 * factorial(3) 3 * factorial(2) Rekursionens djup är fyra i detta exempel där factorial(4) räknas ut. 2 * factorial(1) 24 6 2 1 6

Tornen i Hanoi 1 ring 2 ringar 3 ringar 3 steg 3 steg 7

Tornen i Hanoi uppfyller kraven för rekursion Problemet ska bestå av en eller flera delproblem som liknar problemet självt: Problemet att flytta en hög med ringar innehåller delproblemet att flytta en hög med färre antal ringar. Det måste finnas ett basfall av problemet som är enkelt att lösa (dvs utan rekursion): Basfallet utgörs av problemet med 1 ring. Då är det självklart vad man ska göra: Flytta ringen till höger pinne. Det måste finnas ett sätt att förenkla problemet så att det kommer närmare basfallet: För att flytta n ringar från pinne A till B, gör så här: - flytta n-1 ringar från pinne A till annanpinne(a,b) - flytta ring n till pinne B - flytta n-1 ringar från annanpinne(a,b) till B 8

Pseudokod för Tornen i Hanoi //Pre: n >= 1 //Post: Ringarna på pinne asource har flyttats till //pinne adestination public void hanoi(int n, Pole asource, Pole adestination) { if (n == 1) move(asource, adestination); else { Pole otherpole = otherpole(asource, adestination); hanoi(n 1, asource, otherpole); move(asource, adestination); hanoi(n 1, otherpole, adestination); 9

Iteration eller rekursion Rekursionen i n-fakultet-problemet är en speciell sorts rekursion som kallas svansrekursion(tail rekursion), vilket innebär att sista operationen i en funktion är ett rekursivt anrop. En sådan rekursion kan lätt omvandlas till en iteration. Rekursiv variant //Pre: n >= 1 //Post: resultat = n! public long factorial(int n) { if (n == 1) return 1; else return n * factorial(n 1); Iterativ variant //Pre: n >= 1 //Post: resultat = n! public long factorial(int n) { long result = 1; for (int i = 2; i <= n; i++) result *= i; return result; 10

Iteration eller rekursion Att omvandla en svansrekursion till en iteration är lätt, så lätt att till och med kompilatorer kan göra det. Andra typer av rekursion kan också omvandlas till iteration, men omvandlingsprocessen och koden är i allmänhet mer komplex. Den omvända processen att omvandla en iteration till en rekursion går alltid att göra. Exempel: Iterativ variant public void fillcookiebag( CookieBag abag) { while (!abag.isfull()) abag.addcookie(); Rekursiv variant public void fillcookiebag( CookieBag abag) { //base case: bag is full if (abag.isfull()) return; //general case abag.addcookie(); fillcookiebag(abag); 11

Iteration eller rekursion Om det alltid är möjligt att använda antingen iteration eller rekursion vilken ska man då välja? Detta är en designfråga och för att göra rätt val bör man ställa sig följande två frågor: - passar iteration eller rekursion bäst till problemet - om rekursion är bäst lämpat är det värt kostnaden i minskad effektivetet (tid, minnesutrymme) Rekursion passar bäst för problem som är naturligt självupprepande som tornen i Hanoi. Koden blir lättare att skriva och läsa och som en följd av detta lättare att felsöka och underhålla. Rekursion är långsammare eftersom flera metodanrop är aktiverade samtidigt och systemet måste hantera alla variabler som är inblandade i de olika metodanropen. 12

Rekursiva sorteringsmetoder Merge sort. Denna sorteringsalgoritm är självupprepande och har följande steg: 1) Dela upp listan i två ungefär lika stora listor. 2) Sortera rekursivt de två dellistorna, dvs med just denna algoritm. 3) Foga samman (merge) de två sorterade dellistorna till en sorterad lista. 1) 2) 5 13 2 8 11 3 17 9 1 5 13 2 8 11 3 17 9 1 2 5 8 11 13 1 3 9 17 Lista att sortera. 3) 1 2 3 5 8 9 11 13 17 13

Rekursiva sorteringsmetoder Quicksort. Denna sorteringsalgoritm är självupprepande och har följande steg: 1) Välj ett element, kallat pivotelementet, ur listan. 2) Ordna om listan så att alla element som är mindre än pivotelementet kommer före detta, och så att alla element som är större än pivotelementet kommer efter detta. Pivotelementet har nu fått sin rätta plats. 3) Sortera rekursivt de två dellistorna, dvs med just denna algoritm. 1) 2) 5 13 2 8 11 3 17 9 1 5 13 2 8 11 3 17 9 1 2 3 1 5 13 8 11 17 9 Lista att sortera. Första elementet väljs som pivotelement. Pivotelementet placeras på rätt plats. 3) 1 2 3 5 8 9 11 13 17 14

SpiralApp Problemet att rita en spiral består av delproblemet att rita en mindre spiral. Basfallet består av problemet att rita en spiral som består av enbart ett streck. Man kan förenkla problemet genom att först rita ett streck av spiralen, vrida 45 grader och sedan rita resten av spiralen. public Spiral(double x, double y, double length, double lengthchange, double angle, double anglechange, java.awt.color acolor) {... _firstline = new java.awt.geom.line2d.double( x, y, endx, endy); if (_length <= 3) //base case _rest = null; else _rest = new Spiral(endX, endy, length-lengthchange, lengthchange, angle-anglechange, anglechange, acolor);... 15

TreeApp Problemet att rita ett träd består av delproblemen att rita mindre träd. Basfallet består av problemet att rita ett träd som består av enbart ett streck. Man kan förenkla problemet genom att först rita ett streck av trädet, vrida en aning åt vänster och rita ett träd samt vrida en aning åt höger och rita ett träd. public Tree(double x, double y, double length, double lengthchange, double angle, double anglechange, Color acolor) {... _firstline = new Line2D.Double(x, y, endx, endy); if (_length <= 3) { //base case _leftsubtree = null; _rightsubtree = null; else { _leftsubtree = new Tree(endX, endy, length-lengthchange, lengthchange, angle-anglechange, anglechange, acolor); _rightsubtree = new Tree(endX, endy, length-lengthchange, lengthchange, angle+anglechange, anglechange, acolor);... 16