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
Array vs Vector Konstruktorer Synlighetsmodifierare Grafik this Objekt sortering Listor Repetiton mm 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/Fält Array vs Vektor 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
En konstruktor : Konstruktorer 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 Ärvs av alla subklasser till klassen som finns i samma paket som klassen Tillgänglig från alla klasser i samma paket SXEOLF Synlig överallt Ä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