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