Rekursion • Rekursion är en grundläggande programmeringsteknik • M h a rekursion kan vissa problem lösas på ett mycket elegant sätt • Avsnitt 11 i kursboken: – Att tänka rekursivt – Att programmera rekursivt i Java – Exempel Programmeringsmetodik -Java 254 En Rekursiv Listdefinition • En lista är ett listelement följd av en lista, t ex nummer Nummerlista nummer komma Nummerlista • Inklusive tomma listor [] Nummerlista nummer komma Nummerlista • Nummerlista definieras m h a sig själv Programmeringsmetodik -Java 255 public class IntListNode { protected int myValue; protected IntListNode next; public IntListNode(int value) { myValue = value; next = null; }// IntListNode-constructor public IntListNode(int value, IntListNode nlist) { myValue = value; next = nlist; }// IntListNode-constructor Programmeringsmetodik -Java 256 public IntListNode getNext() { return next; }// getNext public int getValue() { return myValue; }// getValue }// class ListNode Programmeringsmetodik -Java 257 Rekursiva metoder • En metod i Java får anropa sig själv • En rekursiv metod måste hantera – Basfallet – Direkta eller indirekta rekursiva anrop • Varje anrop exekveras i ett eget miljö med nya parametrar och lokala variabler • Detta kallas för inkarnation av metoden • När en inkarnation avslutas återges kontrollen till anroparen (som kan vara en inkarnation av samma metod) Programmeringsmetodik -Java 258 Några exempel • Beräkna summan av alla tal mellan ett och N∈1 • Problemet kan definieras rekursivt: public int sum (int N) { int result; // hjälpvariabel if (N == 1) // basfall result = 1; else result = N + sum (N-1); return result; } Programmeringsmetodik -Java 259 Några exempel … // Beräknar n-te fibonacci tal public int fibonacci (int n) { if (n <= 2) // basfall return 1; else return (fibonacci(n-1) + fibonacci(n-2)); } … Programmeringsmetodik -Java 260 Några exempel • MazeSearch [s. 472-476] 1110110001111 1011101111001 0000101010100 1110111010111 1010000111001 1011111101111 1000000000000 1111111111111 The maze was successfully traversed! 7770110001111 3077707771001 0000707070300 7770777070333 7070000773003 7077777703333 7000000000000 7777777777777 Programmeringsmetodik -Java 261 Direkt/Indirekt rekursion • Direkt rekursion: – Den rekursiva metoden anropar sig själv • Indirekt rekursion – En metod anropar en annan metod som resulterar i att den första metoden anropas – Eftersom indirekt rekursion kan vara svår att följa bör man vara extra försiktig när man använder sig av det. Programmeringsmetodik -Java 262 Rekursion vs Iteration • Alla problem går att lösa iterativt, t ex sum public int sum (int N) { int result = 0; // hjälpvariabel for (int i=1; i <= N; i++) result = result + i; return result; } Programmeringsmetodik -Java 263 Rekursion vs Iteration • Rekursiva lösningar är lämpliga om – Datat som hanteras har definierats rekursivt – Problemet är rekursivt • Rekursiva lösningar är oftast elegantare/enklare • Iterativa lösningar är oftast effektivare Programmeringsmetodik -Java 264 KochSnowflake [s486-491] Programmeringsmetodik -Java 265 Repetiton mm • Array vs Vector • • • • Konstruktorer Synlighetsmodifierare Grafik this • Objekt sortering • Listor Programmeringsmetodik -Java 266 En Allmän Objektsorterare • Problem: – Objekt kan inte sorteras med “<” • • • • Varje klass måste har en egen metod “sort”? Strider mot målet återanvändning! Idé: Skriv en allmän objektsorterare I java finns en sådan variant inbyggd se bl a klasserna Comparable & Collection Programmeringsmetodik -Java 267 En Allmän Objektsorterare • Kraven läggs fast i ett Java interface: – Två objekt kan jämföras interface Sortable{ // left<rigth? public boolean smaller (Object left); } • Nu kan interfacet användas för att skriva en allmän objektsorterare public static void sort (Sortable[] items) Programmeringsmetodik -Java 268 Array vs Vektor • Array/Fält – Fast storlek sedan objektet skapats – Vill man ha en ny storlek så får man skapa ett nytt objekt • Vector – Klass – Fler metoder – Dynamisk storlek • Lägger man till ett element så utökar den storleken så att det ryms. Programmeringsmetodik -Java 269 Konstruktorer • En konstruktor : – För att initialisera nytt objekt – Samma namn som klassen – Returnerar inget värde, void anges inte • Bra att alltid definiera en konstruktor – Utom för Applet. Därför att man inte kan göra allt man skulle vilja göra i appletens konstruktor (t.ex. hämta appletens parametrar, komma åt ritytan, komma åt websidan appleten kom från m.m.) Programmeringsmetodik -Java 270 Synlighetsmodifierare 0RGLILHU Klasser och interface Metoder och variabler 'HIDXOWQRPRGLILHU Synlig i dess paket SXEOLF Synlig överallt Ärvs av alla subklasser till klassen som finns i samma paket som klassen Tillgänglig från alla klasser i samma paket Ärvs av alla subklasser till klassen Tillgänglig från alla klasser SURWHFWHG SULYDWH Ärvs av alla subklasser till klassen Tillgänglig från alla klasser i samma paket Ärvs inte av subklasser Inte tillgänglig i några andra klasser. Programmeringsmetodik -Java 271