Tim Tepaße: Rekursion Stammbaum durchlaufen

Beitrag lesen

Hallo Peter,

Ich blicke nicht mehr durch. Seit Stunden versuche ich einen vorgegebenen
Stammbaum zu durchlaufen. Gegeben ist eine Klasse EmptyPerson:

Das hört sich für mich wie eine Übungsaufgabe an. ;-)

Mit Hilfe Rekursion oder Iteration soll nun die älteste Person im
Stammbaum zurückgegeben werden

public Person eldestPerson() {}

Wenn man rekursiv vorgehen soll (was ja auch nahe liegt), dann braucht diese
Funktion doch irgendwo einen Startpunkt. Kriegt sie keine Person als
Vorgabe (Parameter, Argument)und arbeitet sich von dort über deren Eltern
nach oben? Ich würde das für logisch halten.

(Wahrscheinlich soll diese Methode zur Klasse Person gehören, nich?)

Ich kommentiere mal Deinen ersten Ansatz etwas durch:

public int maxAge() {
//liest das Alter der ältesten Person aus

Wieso definierst Du hier eine extra Methode? Du sollst doch letztendlich
die älteste Person im Stammbaum zurückgeben. Wenn Du erst das Alter
bestimmst, dann mußt Du noch irgendwie die zum Alter passende Person
herausfinden und das könnte eklig werden.

if(this.isEmpty()) {
      return empty.getAge();
     }

Hier kommst Du die Abruchbedingung der Rekursion näher. Aber Du gibst das
Alter zurück und eben nicht die Person.

int i = Math.max(this.getAge(),getFather().maxAge());
     int j = Math.max(this.getAge(),getMother().maxAge());

Und hier achtest Du auch nur auf auf das Alter und nicht auf die Person...

Aber so kann ich nur das Alter zurückgeben und nicht das Objekt...

... aber das hast Du schon richtig erkannt.

Du warst aber mit der Rekursion auf der richtigen Spur. Du mußt nur ein
kleines bisschen mehr Code schreiben. Die Funktion muß dieses tun:

1. Die Funktion kriegt eine Person übergeben.
2. Zuerst testet sie, ob diese Person überhaupt existiert, wenn nein, gibt
   sie diese komische EmptyPerson zurück und beendet sich.
3. Ansonsten ruft sie sich selber auf, einmal für den Vater, einmal für
   die Mutter und kriegt somit zwei Personen zurück.
4. Nun vergleicht sie das Alter der drei Personen, der übergebenen und der
   zwei durch die Rekursion zurückbekommenen.
5. Sie gibt die Person zurück, deren Alter das höchste ist.

Wenn man es erst einmal hat, ist der Gedankensprung in Zukunft nicht mehr
so schwer. Um mich in Python etwas einzugewöhnen, habe ich mal eine mehr
schlechte als rechte (aber funktionierende) Version in Python geschrieben.
Deine Frage kam mir also gerade recht. ;-) Vielleicht hilft es Dir ja beim
Verstehen. Ich habe die Klasse aber stark verändert, vor allem durch den
Verzicht auf das in meinen Augen absurde EmptyPerson und die nervigen
get-Methode. http://tepasse.org/2003/01/27/stammbaum.py

Tim