Datenstrukturen und Algorithmen
Iterativ vs Rekursiv
Im
vorherigen Abschnitt haben wir schon eine Reihe kleiner Algorithmen
umgesetzt, damit wir mit unserer Single Linked List arbeiten konnten.
Dabei haben wir uns ausschließlich auf iterative Ansätze beschränkt. Das
heißt, dass wir die Liste immer nur mit hilfe von Schleifen abgelaufen
sind. Als Beispiel hierzu noch einmal die Methodendefinition von
“laenge”.
public static int laenge(SingleLinkedList liste) { // Leere Liste erkennen und danach stoppen if(liste == null) { return 0; } // Elemente zählen int laenge = 1; while(liste.next != null) { liste = liste.next; laenge ++; } return laenge; }
Bei einer rekursiven Umsetzung würde eine Methode sich selbst
wieder aufrufen um einen Teil des Problems darin zu lösen und diese
Teillösung dann in ein Ergebnis zusammenzufügen.
Unsere Beispielfunktion könnte mit Hilfe von Rekursion wie folgt umgesetzt werden.
public static int laenge(SingleLinkedList liste) { if(liste == null) { return 0; } else { return laenge(liste.next) + 1; } }
Es ist leicht zu sehen, dass der rekursive Ansatz bei diesem Problem mit
weniger Schreibarbeit umgesetzt werden kann. Das ist nicht in jedem
Fall so. Auch ist in diesem Fall die iterative Implementierung
sicherlich vom Laufzeitverhalten sicherlich besser. Es gibt aber
Problemstellungen, die sich in nach dem einen oder anderen Verfahren
wesentlich besser umsetzen lassen.