Rekursiv programmering

Like dokumenter
Rekursiv programmering

Definisjon av binært søketre

Definisjon. I et binært tre har hver node enten 0, 1 eller 2 barn

Definisjon: Et sortert tre

Logaritmiske sorteringsalgoritmer

Et eksempel: Åtterspillet

Sorteringsproblemet. Gitt en array A med n elementer som kan sammenlignes med hverandre:

Et eksempel: Åtterspillet

Binære trær: Noen algoritmer og anvendelser

Dagens temaer. Sortering: 4 metoder Søking: binærsøk Rekursjon: Hanois tårn

Rekursjon. Binærsøk. Hanois tårn.

Heap* En heap er et komplett binært tre: En heap er også et monotont binært tre:

Binære søketrær. Et notat for INF1010 Stein Michael Storleer 16. mai 2013

INF2220: Time 12 - Sortering

Binære søketrær. En ordnet datastruktur med raske oppslag. Sigmund Hansen

Dagens tema. Sortering. Fortsettelse om programmering vha tråder.

EKSAMEN. Dato: 18. mai 2017 Eksamenstid: 09:00 13:00

Rekursjon. (Big Java kapittel 13) Fra Urban dictionary: recursion see recursion. IN1010 uke 8 våren Dag Langmyhr

Lars Vidar Magnusson

Binær heap. En heap er et komplett binært tre:

PG4200 Algoritmer og datastrukturer Forelesning 3 Rekursjon Estimering

Søkeproblemet. Gitt en datastruktur med n elementer: Finnes et bestemt element (eller en bestemt verdi) x lagret i datastrukturen eller ikke?

Fra Kap.10 Binære søketre (BS-tre) Sist oppdatert Definere en abstrakt datastruktur binært søketre. Vise hvordan binær søketre kan brukes

EKSAMEN. Dato: 28. mai 2018 Eksamenstid: 09:00 13:00

Heap og prioritetskø. Marjory the Trash Heap fra Fraggle Rock

EKSAMEN med løsningsforslag

MAT1030 Diskret matematikk

Innhold. Innledning 1

Rekursjon. (Big Java kapittel 13) Fra Urban dictionary: recursion see recursion. IN1010 uke 8 våren Dag Langmyhr

Algoritmer og Datastrukturer

Stack. En enkel, lineær datastruktur

INF2220: Forelesning 2

Binære Søketre. Egenskap. Egenskap : Grafisk. Egenskap : Kjøretid. Egenskap : Kjøretid. Egenskap : Oppsumering. Binære Søketre

Rekursjon som programmeringsteknikk

Løsnings forslag i java In115, Våren 1998

Trær. Består av sammenkoblede noder Hver node har 0 eller flere barne-noder. Må være asyklisk. Et tre med n noder har n-1 kanter.

Oppsummering. MAT1030 Diskret matematikk. Oppsummering. Oppsummering. Eksempel

INF2220: Forelesning 1. Praktisk informasjon Analyse av algoritmer (kapittel 2) (Binær)trær (kapittel )

INF Algoritmer og datastrukturer

Datastrukturer for rask søking

Eksamen iin115, 14. mai 1998 Side 2 Oppgave 1 15 % Du skal skrive en prosedyre lagalle som i en global character array S(1:n) genererer alle sekvenser

INF Algoritmer og datastrukturer

TDT4105 Informasjonsteknologi, grunnkurs. Mer om funksjoner: - rekursive funksjoner

Kapittel 12: Rekursjon

Rekursjon. Hanois tårn. Milepeler for å løse problemet

Hva er en algoritme? INF HØSTEN 2006 INF1020. Kursansvarlige Ragnar Normann E-post: Dagens tema

TDT4105 Informasjonsteknologi, grunnkurs

Longest increasing. subsequence Betingelser. Longest. common subsequence. Knapsack Grådig vs. DP Moro: 2D-Nim Spørsmål. Forside. Repetisjon.

Løsningsforslag MATEMATIKK 1, MX130

Avsluttende eksamen i TDT4120 Algoritmer og datastrukturer

AlgDat 12. Forelesning 2. Gunnar Misund

Backtracking som løsningsmetode

INF1010 Rekursive metoder, binære søketrær. Algoritmer: Mer om rekursive kall mellom objekter Ny datastruktur: binært tre

INF Algoritmer og datastrukturer

EKSAMEN. Dato: 9. mai 2016 Eksamenstid: 09:00 13:00

Kap 9 Tre Sist oppdatert 15.03

Matematisk julekalender for trinn, 2014

INF2220: Time 4 - Heap, Huffmann

INF Algoritmer og datastrukturer. Hva er INF2220? Algoritmer og datastrukturer

IN Algoritmer og datastrukturer

Anvendelser av grafer

Repetisjon: Binære. Dagens plan: Rød-svarte trær. Oppgave (N + 1)!

Norsk informatikkolympiade runde

INF Algoritmer og datastrukturer

E K S A M E N. Algoritmiske metoder I. EKSAMENSDATO: 11. desember HINDA / 00HINDB / 00HINEA ( 2DA / 2DB / 2EA ) TID:

Algoritmer og datastrukturer Kapittel 9 - Delkapittel 9.1

INF Algoritmer og datastrukturer

PG4200 Algoritmer og datastrukturer Forelesning 7

Longest. increasing. subsequence. Betingelser. Matrise- common. Grådig vs. DP. Forside. Intro. Fibonacci-tall. Memoisering DP

PG 4200 Algoritmer og datastrukturer Innlevering 2

Hvorfor sortering og søking? Søking og sortering. Binære søketrær. Ordnet innsetting forbereder for mer effektiv søking og sortering INF1010 INF1010

Kapittel 12: Rekursjon

Pensum: fra boken (H-03)+ forelesninger

Oppgave 1. Sekvenser (20%)

Liste som abstrakt konsept/datatype

PQ: HEAP. Heap. Er disse heap er? Hvordan implementere heap:

Algoritmer og Datastrukturer

Prioritetskøer. Binære heaper Venstrevridde heaper (Leftist) Binomialheaper Fibonacciheaper

Norsk informatikkolympiade runde

Oppgave 1 Minimum edit distance

MAT1030 Diskret Matematikk

INF2220: Forelesning 2. Balanserte søketrær Rød-svarte trær (kapittel12.2) B-trær (kapittel 4.7)

INF2220: Forelesning 2

Transkript:

Rekursiv programmering

Babushka-dukker En russisk Babushkadukke er en sekvens av like dukker inne i hverandre, som kan åpnes Hver gang en dukke åpnes er det en mindre utgave av dukken inni, inntil man kommer til den minste dukken, som ikke kan åpnes

Sierpinskis trekant

Rekursive definisjoner/beskrivelser Et objekt eller en formel er rekursiv(t) hvis det som defineres er beskrevet med mindre versjoner av seg selv En rekursiv definisjon består av: 1.Et minste tilfelle ( base case ) som ikke kan beskrives med mindre utgaver av seg selv 2.En rekursiv del som beskriver hvorledes formelen/objektet kan uttrykkes med mindre utgaver av seg selv

Eksempel fra IT: Binært tre Datastruktur der hver node kan ha to etterfølgere Rekursiv definisjon: Et binært tre er en struktur med et endelig antall noder som enten: Ikke inneholder noen noder (er tomt), eller består av en rotnode, med et venstre subtre som er et binært tre, og et høyre subtre som er et binært tre Minste tilfelle: Null noder Rekursiv del: En rotnode, og to binære trær som begge har en node mindre

Eksempel fra IT: Flettesortering Splitt og hersk - algoritme Splitt/del arrayen med n elementer i to mindre arrayer med n/2 elementer i hver Base case: Kun ett element i arrayen Sorter de to halvdelene rekursivt med flettesortering Flett de to sorterte halvdelene sammen til en hel sortert array

Rekursive algoritmer Må alltid ha minst ett base case /minste tilfelle som kan løses uten rekursjon Må ha et steg som reduserer problemet som skal løses til en mindre problem med samme struktur Problemet må ha et mål for problemstørrelsen som flytter seg mot base case i hvert rekursive steg Dette sikrer at algoritmen til slutt når base case (bunnen i rekursjonen) I rekursiv programmering må vi anta at rekursjonen alltid virker og da vil den virke! (magi?)

Klassisk eksempel: Fakultetet Iterativ definisjon: n! = n (n 1) (n 2)... 3 2 1 Kan beregnes enkelt med en for-løkke Rekursiv definisjon: n! = 1, hvis n = 1 n! = n (n 1)!, hvis n > 1 Kan programmeres rett frem med et rekursivt metodekall Se Java-koden

Rekursive kall: factorial(6) factorial(6) = 6 * factorial(5) factorial(5) = 5 * factorial(4) factorial(4) = 4 * factorial(3) factorial(3) = 3 * factorial(2) factorial(2) = 2 * factorial(1) factorial(1) = 1 factorial(2) = 2 * factorial(1) = 2 * 1 = 2 factorial(3) = 3 * factorial(2) = 3 * 2 = 6 factorial(4) = 4 * factorial(3) = 4 * 6 = 24 factorial(5) = 5 * factorial(4) = 5 * 24 = 120 factorial(6) = 6 * factorial(5) = 6 * 120 = 720

Og hva skjer bak kulissene? Rekursjon er mystisk (til å begynne med) for oss... Men, for datamaskinen/kompilatoren er det ingen forskjell på et rekursivt metodekall og et vanlig metodekall Når en metode kaller en annen metode: Alle data for kallende metode legges unna på en memory stack og en execution stack (og noe mer...) Når metoden som kalles er ferdig med å eksekvere, tar kallende metode over igjen, lokale data hentes fra stackene og eksekveringen fortsetter fra rett etter det ferdige metodekallet

Dårlig eksempel: Fibonaccitall Fibonaccitallene er en sekvens av heltall, F1, F2, F3, F4,, som er slik at: F1 = 1 og F2 = 1 Hvert av de neste Fibonaccitallene er lik summen av de to foregående: 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, Kan defineres rekursivt: F1 = 1 og F2 = 1 Fn = Fn-1 + Fn-2, n > 2 Rekursiv Java-kode for beregning av Fn

Kalltre for rekursiv beregning av F6

Rekursjon og effektivitet Rekursiv beregning av Fibonacci-tall gjør svært mange redundante beregninger Er ekstremt ineffektiv: Kan vises (med induksjonsbevis) at kjøretiden vokser som Fn, som er eksponentielt (Fn 1.62n) Lett å lage en iterativ versjon som er O(n) Rekursjon kan alltid erstattes med iterasjon Bruk rekursjon bare hvis det gir en enklere (og/eller mer elegant) løsning som ikke er vesentlig mer ineffektiv enn iterativ

Rekursiv beregning av kvadrat-tall Kvadrat-tallene: Antall ruter i et kvadrat med i ruter langs hver sidekant: Ki = i2, i = 1, 2, 3, 4,... 1, 4, 9, 16, 25, 36, 49, 64,... Rekursivt: K1 = 1 Ki = 2 i 1 + Ki-1, i > 1 Oppgave: Skriv en rekursiv Java-funksjon som beregner Kn Hva er arbeidsmengden?

En rekursiv linjal Skal tegne en linjal med n nivåer (n = 8 ovenfor) og lengde L Algoritme: Hvis n = 0, ingenting å gjøre Hvis n > 0 Tegn en vertikal strek med høyde h(n) i posisjon L/2 Tegn venstre og høyre halvdel rekursivt, med n 1 nivåer, lengde L/2, sentrert i hhv. L/4 og 3L/4 Java-kode (grafikk-delen er uvesentlig)

Fraktaler Selv-repeterende objekter som er identiske eller likeformet uansett hvor mye vi zoomer inn Lages oftest med enkle, repeterende operasjoner Kan gi opphav til fascinerende mønstre med uendelig dybde Mest berømte fraktal: Mandelbrotmengden

En enkel fraktal

Algoritme for å tegne fraktalen Senter i (0,0) Største kvadrat har sidekant med lengde L Rekursiv algoritme: Hvis L < 1, ferdig Tegn rekursivt de fire delene av fraktalen med sentre i (-L/2, L/2), (L/2, L/2), (L/2, -L/2) og (-L/2, -L/2), der største kvadrats sidekant har lengde L/2 Tegn største kvadrat med sidekant av lengde L Java-kode

En klassiker: Hanois tårn n ringer, alle av ulik størrelse. 3 pinner. Mål: Flytt alle ringer fra venstre til høyre pinne Regler: Kun én ring kan flyttes av gangen, til en annen pinne Ingen ring kan legges oppå en ring som er mindre

Løsning av Hanois tårn for n = 4 For animasjon av løsninger med vilkårlig n, se f.eks emacs (Ctrl u n Esc x hanoi)

Rekursiv løsning av Hanois tårn Tre pinner, A, B og C, n ringer ligger på pinne A: Hvis n = 1 Flytt ringen fra A til C ellers Flytt n-1 øverste ringer rekursivt fra A til B Flytt største ring fra A til C Flytt n-1 ringer rekursivt fra B til C Se Java-kode fra læreboka

Antall flytt for å løse Hanois tårn Med n ringer må ringene flyttes 2n - 1 ganger Induksjonsbevis: 1 ring: 2 ringer: 22-1 = 4 1 = 3 flytt (A-B, A-C, B-C) n ringer: Flytte n 1 ringer fra A til B: Flytte største ring fra A til C: 2n-1 1 1 Flytte n 1 ringer fra B til C: 2n-1 1 Totalt: 1 + 2 (2n-1 1) = 1 + 2n 2 = 2n 1 21-1 = 2 1 = 1 flytt (A-C) Løsningen er elegant, men svært tidkrevende