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

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

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

Begreppet subtyp/supertyp i Java. Mera om generik. Generik och arv. Generik och arv. Innehåll

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

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

Föreläsning 3-4 Innehåll

Rekursion. Koffman & Wolfgang kapitel 5

Rekursion och induktion för algoritmkonstruktion

Föreläsning 13. Rekursion

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

Föreläsning 4 Innehåll. Abstrakta datatypen lista. Implementering av listor. Abstrakt datatypen lista. Abstrakt datatyp

Föreläsning 4 Innehåll

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

Föreläsning 10 Innehåll. Diskutera. Inordertraversering av binära sökträd. Binära sökträd Definition

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.

Föreläsning 9 Innehåll

Föreläsning 10 Innehåll

Föreläsning 12 Innehåll

Tentamen i Algoritmer & Datastrukturer i Java

Föreläsning 11 Innehåll. Diskutera. Binära sökträd Definition. Inordertraversering av binära sökträd

Föreläsning 5 Innehåll

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

Lösningsförslag till tentamen Datastrukturer, DAT037,

DAT043 - föreläsning 8

Sortering. Föreläsning 12 Innehåll. Sortering i Java. Sortering i Java Exempel. Sortering

Föreläsning 2 Datastrukturer (DAT037)

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.

Föreläsning 12 Innehåll

TDDI16 Datastrukturer och algoritmer. Algoritmanalys

Hitta k största bland n element. Föreläsning 13 Innehåll. Histogramproblemet

Abstrakt datatyp. -Algoritmer och Datastrukturer- För utveckling av verksamhet, produkter och livskvalitet.

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

Föreläsning REPETITION & EXTENTA

Föreläsning 5 Innehåll. Val av algoritm och datastruktur. Analys av algoritmer. Tidsåtgång och problemets storlek

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

Föreläsning 10 Innehåll. Prioritetsköer och heapar. ADT Prioritetskö. Interface för Prioritetskö. Exempel på vad du ska kunna

Tentamen, Algoritmer och datastrukturer

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

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

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

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

Datastrukturer D. Föreläsning 2

Föreläsning 11 Innehåll

Föreläsning ALGORITMER: SÖKNING, REGISTRERING, SORTERING

Föreläsning 5. Rekursion

ADT Kö. Seminarium 4 Köer och Stackar Innehåll. Operationer. ADT Stack. Definition. Definition

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

F11 - Rekursion. ID1004 Objektorienterad programmering Fredrik Kilander

Dugga Datastrukturer (DAT036)

Datastrukturer. föreläsning 2

Datastrukturer. föreläsning 3. Stacks 1

Föreläsning 9-10 Innehåll

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

Tentamen Datastrukturer (DAT036)

Föreläsning 5-6 Innehåll. Exempel på program med objekt. Exempel: kvadratobjekt. Objekt. Skapa och använda objekt Skriva egna klasser

ADT Prioritetskö. Föreläsning 13 Innehåll. Prioritetskö vs FIFO-kö. Prioritetskö Exempel på användning. Prioritetsköer och heapar

Föreläsning 5-6 Innehåll

Föreläsning 11 Innehåll. Sortering. Sortering i Java. Sortering i Java Comparable. Sortering. O(n 2 )-algoritmer: urvalssortering insättningssortering

Datastrukturer som passar för sökning. Föreläsning 10 Innehåll. Inordertraversering av binära sökträd. Binära sökträd Definition

Programmering för Språkteknologer II. Innehåll. Associativa datastrukturer. Associativa datastrukturer. Binär sökning.

Föreläsning 2 Datastrukturer (DAT037)

Mera om generik. Innehåll. Generik och arv Wildcards Vektorer och generik Generiska metoder. EDA690 (Mera om generik) HT / 24

Sökning och sortering

Programmeringsteknik - fördjupningskurs

Algoritmer och effektivitet. Föreläsning 5 Innehåll. Analys av algoritmer. Analys av algoritmer Tidskomplexitet. Algoritmer och effektivitet

Föreläsning 4 Datastrukturer (DAT037)

LÖSNINGSFÖRSLAG Programmeringsteknik För Ing. - Java, 5p

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

Tentamen Datastrukturer (DAT037)

Rekursion och induktion för algoritmkonstruktion

Datastrukturer i kursen. Föreläsning 8 Innehåll. Träd rekursiv definition. Träd

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

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

Övningshäfte 2: Induktion och rekursion

Tentamen i Algoritmer & Datastrukturer i Java

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

Lösningsförslag till exempeltenta 1

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

Dekomposition och dynamisk programmering

Algoritmer. Två gränssnitt

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

Föreläsning 3 Innehåll. Generiska klasser. Icke-generisk lista ArrayList, skiss av implementering. Icke-generisk lista Risk för fel

Generiska konstruktioner. Kursbokens kapitel 13

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

Föreläsning 11 Datastrukturer (DAT037)

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

Tentamen Datastrukturer, DAT037 (DAT036)

Föreläsning 8 Innehåll

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

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

2D1311 Programmeringsteknik för Bio1 och Bio2, vt 2003 Fiktivt prov På flervalsfrågorna är endast ett svar rätt om inget annat anges i frågan! Det rik

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

Rekursion och induktion för algoritmkonstruktion

Tommy Färnqvist, IDA, Linköpings universitet

TENTAMEN PROGRAMMERINGSMETODIK MOMENT 2 - JAVA, 4P

Datastrukturer som passar för sökning. Föreläsning 11 Innehåll. Binära sökträd Definition. Inordertraversering av binära sökträd

Objektorienterad programmering

Tentamen i Grundläggande Programvaruutveckling, TDA548

Inlämningsuppgiften. Föreläsning 9 Innehåll. Träd. Datastrukturer i kursen

Föreläsning 5. Rekursion

Transkript:

Föreläsning 7 Innehåll Rekursion Rekursivt tänkande: Hur många år fyller du? Ett år mer än förra året! Rekursion Rekursiv problemlösning Binärsökning Generiska metoder Rekursiv problemlösning: Dela upp problemet i en eller flera enklare versioner av det ursprungliga problemet. Rekursiva metoder är metoder som anropar sig själva. Många datastrukturer går att definiera rekursivt. Ex: listor, träd Datavetenskap (LTH) Föreläsning 7 VT 2018 1 / 37 Datavetenskap (LTH) Föreläsning 7 VT 2018 2 / 37 Rekursiv problemlösning Rekursiv problemlösning Mönster för rekursiv algoritm Kan liknas vid önsketänkande: Om jag har lösningen till en (eller flera) mindre instans(er) så kan jag konstruera en lösning för den aktuella instansen genom att... Ex: Summera de n första talen i en vektor. Rekursivt tänkande: Om summan av de n-1 första talen är känd, så får vi lösningen genom att summera denna summa och det sista talet. För att det ska fungera krävs basfall där lösningen ges explicit. Basfallen är (oftast) små instanser, t ex 0. I exemplet ovan är ett naturligt basfall n=0. Då är summan 0. Rekursiv lösning för problem med storlek n: Om problemet går att lösa för aktuellt n-värde: Lös det annars Lös problemet (rekursivt) för en eller flera mindre värden på n Kombinera dessa lösningar till en lösning på problemet för n Datavetenskap (LTH) Föreläsning 7 VT 2018 3 / 37 Datavetenskap (LTH) Föreläsning 7 VT 2018 4 / 37

Rekursiv beräkning av n! Exekvering och metodanrop Definition 0! =1 (basfall) n! =n (n 1)!, n heltal > 0 (rekursiva steget) För alla metodanrop (rekursiva såväl som icke-rekursiva) gäller: Ett anrop av en metod innebär att exekveringen fortsätter med den första satsen i den anropade metoden. När den anropade metoden är klar återupptas exekveringen i den metod där anropet gjordes. public static long factorial(int n) { if (n == 0) { return 1; else { return n * factorial(n - 1); public void p() { q(); public void q() { r(); public void r() { Datavetenskap (LTH) Föreläsning 7 VT 2018 5 / 37 Datavetenskap (LTH) Föreläsning 7 VT 2018 6 / 37 Exekvering av rekursiva metoder Exempel Exekvering och metodanrop 6 factorial(3) return 3 * factorial(2) Vid exekvering av ett metodanrop skapar runtimesystemet en aktiveringspost. 2 factorial(2) return 2 * factorial(1) 1 factorial(1) n = 1 return 1 * factorial(0) 1 factorial(0) n = 0 return 1 I aktiveringsposten finns uppgifter om återhoppsadress (där anropet gjordes) parametrarnas värden lokala variabler och deras värden Aktiveringsposterna placeras i en stack. Den metod som exekverar har sin post överst på stacken. Aktiveringsposten tas bort när metoden exekverat klart. Datavetenskap (LTH) Föreläsning 7 VT 2018 7 / 37 Datavetenskap (LTH) Föreläsning 7 VT 2018 8 / 37

Exekvering av rekursiva metoder Rekursiva metoder anropar sig själva. Det kommer att på stacken finnas aktiveringsposter för alla oavslutade upplagor av metoden. Stackens utseende under exekvering av ett anrop av factorial(3): Endast parmeterns värde visas för varje upplaga. Efter anrop factorial(3) Efter anrop factorial(2) n = 1 Efter anrop factorial(1) n = 0 n = 1 Efter anrop factorial(0) n = 1 Efter return 1 Efter return 1*factorial(0) Efter return 2*factorial(1) Efter return 3*factorial(2) Rekursiv metod En rekursiv metod måste ha: En eller flera parametrar som bestämmer problemets storlek Ett eller flera basfall som löses direkt. Ett eller flera rekursiva anrop. De rekursiva anropen måste leda till att ett basfall så småningom nås. public static int factorial(int n) { if (n == 0) { return 1; basfall else { return n * factorial(n - 1); rekursivt anrop parameter Datavetenskap (LTH) Föreläsning 7 VT 2018 9 / 37 Datavetenskap (LTH) Föreläsning 7 VT 2018 10 / 37 Övning Exempel: Skriv ut ett tal baklänges Algoritm Skriv en rekursiv metod som beräknar x n. n är ett positivt heltal. Definition x 0 = 1 x n = x x n 1, n heltal > 0 Problem: Givet ett heltal n 0. Skriv ut siffrorna i omvänd ordning. Exempel: Talet 257 ska ge utskriften 752 Basfall: Talet har bara en siffra. Skriv ut denna enda siffra. Rekursiva steget: Skriv först ur sista siffran. Skriv därefter ut de övriga siffrorna i omvänd ordning. Datavetenskap (LTH) Föreläsning 7 VT 2018 11 / 37 Datavetenskap (LTH) Föreläsning 7 VT 2018 12 / 37

Exempel: Skriv ut ett tal baklänges Rekursiv metod Exempel: Skriv ut ett tal baklänges Negativa tal public static void reverse(int n) { if (n < 10) { System.out.print(n); else { System.out.print(n % 10); reverse(n / 10); Metoden klarar inte och ska inte klara negativa tal Det bör kontrolleras. Vi inför därför en metod som först kontrollerar parametern och därefter anropar den rekursiva metoden: public static void printreverse(int n) { if (n < 0) { throw new IllegalArgumentException("Argument < 0"); reverse(n); System.out.println(); Den rekursiva metoden bör nu göras privat. Datavetenskap (LTH) Föreläsning 7 VT 2018 13 / 37 Datavetenskap (LTH) Föreläsning 7 VT 2018 14 / 37 Rekursion och listor Rekursiva datastrukturer Rekursion och listor Klassen SingleLinkedList från tidigare föreläsning Begreppet lista med n element kan definieras rekursivt: om n == 0 är listan tom (basfall) annars består den av ett första element följt av en lista med n 1 element public class SingleLinkedList<E> { private ListNode<E> first; private static class ListNode<E> { E element; ListNode<E> next; första elementet lista med n-1 element first next element next element next element null Datavetenskap (LTH) Föreläsning 7 VT 2018 15 / 37 Datavetenskap (LTH) Föreläsning 7 VT 2018 16 / 37

Diskutera Rekursion och listor Rekursion och listor Exempel Antag att vi vill skriva ut innehållet i den enkellänkade listan i omvänd ordning med rekursiv teknik. Börja med att tänka ut basfall. enklare delproblem (rekursiva steget). Skissa sedan på algoritmen i pseudokod. Problem: Skriv ut innehållet i listan i omvänd ordning. public void printreverse() { printreverse(first); private void printreverse(listnode<e> node) { if (node!= null) { printreverse(node.next); System.out.println(node.element); Datavetenskap (LTH) Föreläsning 7 VT 2018 17 / 37 Datavetenskap (LTH) Föreläsning 7 VT 2018 18 / 37 Rekursion och listor Observationer Hanois torn Bonusexempel Basfallet i printreverse syns inte. Basfallet är den tomma listan (node == null) dåingentinggörs. Metoden har tidskomplexitet O(n) det görs n metodanrop och i varje upplaga görs ett arbete som tar konstant tid. Ett alternativ är att söka efter sista, näst sista o.s.v. Det blir krångligare kod och högre tidskomplexitet. I printreverse vi utnyttjat att vi har tillgång till den interna datastrukturen. Om man använder någon av Collection-klasserna i Java får man lösa det på något annat sätt. Man kan t.ex. använda en stack. Hanois torn är ett matematiskt pussel som går ut på att flytta ett antal skivor från en pinne till en annan enligt vissa regler. Minimala antal drag som behövs för att lösa pusslet för n skivor är 2 n 1. Här finns mer att läsa: https://en.wikipedia.org/wiki/tower_of_hanoi Datavetenskap (LTH) Föreläsning 7 VT 2018 19 / 37 Datavetenskap (LTH) Föreläsning 7 VT 2018 20 / 37

Hanois torn Hanois torn regler n skivor finns i avtagande storlek på en pinne (start). 1 2 3 4 5 pinne 1 pinne 2 pinne 3 Flytta dem så att de kommer i samma inbördes ordning på en av de andra pinnarna (dest). Även den tredje pinnen (temp) får utnyttjas för mellanlagring. Bara en skiva i taget får flyttas. En skiva som tas från en pinne måste genast läggas på en av de andra pinnarna. Det får aldrig inträffa under flyttningarnas gång att en större skiva hamnar ovanför en mindre (på samma pinne). Datavetenskap (LTH) Föreläsning 7 VT 2018 21 / 37 Datavetenskap (LTH) Föreläsning 7 VT 2018 22 / 37 Hanois torn rekursiv lösning Basfall: Endast en skiva att flytta (n = 1). Flytta skivan från start till dest. Rekursiva steget: 1 Flytta först de n 1 översta skivorna från start till temp. 2 Flytta därefter den största skivan från start till dest. 3 Till sist flyttas de n 1 skivorna från temp till dest. 1 2 3 4 5 1. från start till temp 3. från temp till dest Hanois torn rekursiv metod public void move(int n, int start, int dest, int temp) { if (n == 1) { System.out.println("Move from " + start + " to " + dest); else { move(n - 1, start, temp, dest); System.out.println("Move from " + start + " to " + dest); move(n - 1, temp, dest, start); 2. från start till dest Datavetenskap (LTH) Föreläsning 7 VT 2018 23 / 37 Datavetenskap (LTH) Föreläsning 7 VT 2018 24 / 37

Binärsökning Algoritm Om en vektor är sorterad i växande ordning och vi söker ett element x, finns en effektiv algoritm: Basfall: 0 element. Sökt element finns ej. Rekursiva steget: 1 Jämför x med mittelementet i vektorn. Om likhet, avbryt. 2 Om x är mindre än mittelementet, fortsätt sökningen i vänster halva av vektorn. 3 Om x är större än mittelementet, fortsätt sökningen i höger halva av vektorn. Datavetenskap (LTH) Föreläsning 7 VT 2018 25 / 37 Binärsökning - parametrar I den rekursiva lösningen måste varje upplaga av metoden känna till vilken del av vektorn den arbetar med. Det kommer därför att behövas parametrar för första index och sista index i den rekursiva metoden. Användare ska dock inte behöva anropa med två index. Det räcker att de anger vad som söks och vilken vektor det ska sökas i. Den publika metoden som användare får tillgång till: /** Returns the index of x if found in the array a, otherwise -1. The array must be sorted.*/ public static int binarysearch(int[] a, int x) { return binarysearch(a, x, 0, a.length - 1); Den rekursiva hjälpmetodens rubrik: private static int binarysearch(int[] a, int x, int first, int last); Datavetenskap (LTH) Föreläsning 7 VT 2018 26 / 37 Binärsökning - generisk metod Binärsökning Generiska metoder Vi vill ha en generell metod, d.v.s. en metod som kan söka efter ett element i en vektor av godtycklig typ (och inte bara heltal). Lösning: Låt metoden vara generisk, dvs deklarera en typparameter (E) i metodrubriken. public static <E> int binarysearch(e[] a, E x) Vi måste dock kräva att elementen är av en typ för vilka jämförelse är definierad eftersom vektorn ska vara sorterad. Lösning: Kräv att den klass som ersätter E implementerar interfacet Comparable. public static <E extends Comparable<E>> int Den publika metoden som användare får tillgång till: /** Returns the index of x if found in the array a, otherwise -1. The array must be sorted.*/ public static <E extends Comparable<E>> int binarysearch(e[] a, E x) { return binarysearch(a, x, 0, a.length - 1); Den rekursiva hjälpmetodens rubrik: private static <E extends Comparable<E>> int binarysearch(e[] a, E x, int first, int last); Implementering följer, men först en liten utvikning om generiska metoder. Datavetenskap (LTH) Föreläsning 7 VT 2018 27 / 37 Datavetenskap (LTH) Föreläsning 7 VT 2018 28 / 37

Generiska metoder Generiska metoder Man kan deklarera generiska metoder, genom att parametrisera metoden med en eller flera typparametrar. Exempel: public class Utilities { /* Fyller alla platser i a med elementet x */ public static <T> void fill(t[] a, T x) { for (int i = 0; i < a.length; i++) { a[i] = x; Typparameter (en eller flera) anges inom < och > före metodens returtyp. Generiska metoder kan anropas utan att man explicit anger vad typen T är: Integer[] nbrs = new Integer[10]; Utilities.fill(nbrs, -1); String[] a = new String[5]; Utilities.fill(a, "abc"); För det första anropet fastställer kompilatorn typen T till Integer och idetandratillstring. Datavetenskap (LTH) Föreläsning 7 VT 2018 29 / 37 Datavetenskap (LTH) Föreläsning 7 VT 2018 30 / 37 Den generiska metoden binarysearch Binärsökning Privat metod public static <E extends Comparable<E>> int binarysearch(e[] a, E x) { return binarysearch(a, x, 0, a.length - 1); Har en typparameter E med inskränkning: E måste vid anrop vara en klass som implementerar interfacet Comparable<E> Har returtyp int: Returtypen skrivs efter typparametrarna Har två parametrar som använder E i sin deklaration: E[] a och E x private static <E extends Comparable<E>> int binarysearch(e[] a, E x, int first, int last) { if (first > last) { return -1; else { int mid = first + ((last - first) / 2); int compresult = x.compareto(a[mid]); if (compresult == 0) { return mid; else if (compresult < 0) { return binarysearch(a, x, first, mid - 1); else { return binarysearch(a, x, mid + 1, last); Datavetenskap (LTH) Föreläsning 7 VT 2018 31 / 37 Datavetenskap (LTH) Föreläsning 7 VT 2018 32 / 37

Binärsökning Effektivitet Samband mellan rekursion och induktion Överkurs Linjärsökning är O(n) i värsta fall. Binärsökningen är mycket effektivare. I värsta fall finns inte x i vektorn. Vi börjar med vektorstorlek n, därefter n/2, n/4,n/2 k,,1, 0. Det krävs 2 log(n) halveringar i värsta fall. I varje upplaga krävs konstant arbete. Hela algoritmen blir därför O(logn) i värsta fall. Matematisk induktion används ofta för att bevisa samband som gäller för positiva heltal n. Bevisen görs i två steg: 1 Visa att sambandet gäller för ett eller flera små värden på n. 2 Visa att om man gör antagandet att sambandet håller för alla heltal n upp till ett visst värde k, så gäller det även för närmast större värde k+1. Datavetenskap (LTH) Föreläsning 7 VT 2018 33 / 37 Datavetenskap (LTH) Föreläsning 7 VT 2018 34 / 37 Samband mellan rekursion och induktion exempel Överkurs Induktion för att visa att en rekursiv algoritm är korrekt Överkurs Visa att 1 + 2 + 3 + + n = n(n + 1)/2 förallan 1 1 n = 1. Vänsterledet = 1. Högerledet = 1 2/2 = 1. Stämmer. 2 Vi antar nu att 1 + 2 + + n = n(n + 1)/2 för1apple n apple k (*) Visa att 1 + 2 + + k + k + 1 =(k + 1)(k + 2)/2. Vänsterledet = (1 + 2 + + k)+k + 1 = [enligt (*)] = k(k + 1)/2 + k + 1 =(k 2 + 3k + 2)/2 Högerledet = (k + 1)(k + 2)/2 =(k 2 + 3k + 2)/2 = Vänsterledet. Datavetenskap (LTH) Föreläsning 7 VT 2018 35 / 37 public static long factorial(int n) { if (n == 0) { return 1; else { return n * factorial(n - 1); 1 När n=0 blir resultatet 1 vilket är korrekt enligt def av n! 2 Antag att algoritmen ger korrekt resultat för 0 apple n apple k. (*) Anrop factorial(k+1) ger (eftersom k + 1 > 0) resultatet (k + 1) factorial(k+1-1) =(k + 1) factorial(k). Enligt induktionsantagandet (*) ger anropet factorial(k) korrekt resultat, dvs k!. Vi får därför resultatet (k + 1) k! =(k + 1)! V.S.B. Datavetenskap (LTH) Föreläsning 7 VT 2018 36 / 37

Exempel på vad du ska kunna Förklara begreppet rekursion. Förklara hur rekursion fungerar. Formulera rekursiva algoritmer och implementera rekursiva metoder. Datavetenskap (LTH) Föreläsning 7 VT 2018 37 / 37