Rekursion Programmierverständnis

Taso44

Aktives Mitglied
Hallo zusammen,
ich bin was Programmierung angeht glaube noch eher bei den Anfängern.
Ich habe einen Code (Aufgabe) , indem ich die Werte bei jedem Durchgang der Rekursion ausgeben muss. Ich habe jedoch keine weiteren Ideen mehr, vielleicht könnt ihr mir helfen.
Folgende Methode ist gegeben:

static int f(int x, int y) {
System.out.println(x + " " + y);
if (x <= 1) {
return 2;
} else if (y <= 0) {
return 1;
} else
return 2 * (f(x + 1, y - 3) - f(x - 3, y)) + 1;

Das mit der Rekursion fällt mir noch ziemlich schwer. Für den Aufruf mit f(5,4) bekomme ich folgende Bildschirmausgabe:

5 4
6 1
7 -2
3 1
4 -2
0 1
2 4
3 1
4 -2
0 1
-1 4
21

Ich komme bis zur 3 Zeile irgendwie mit, doch dann hörts auf.
Also mein Anliegen/Frage:
Wie entsteht die Ausgabe hier?
Wann muss ich die 2 draufmultiplizieren soll ich die rekursiven Aufrufe voneinander abziehen, kann ich das und wenn ja wie?

Danke schonmal im Voraus
MfG, Taso44

PS: Sorry, die Frage ist vlt etwas länger geraten, ist auch mein erster Beitrag
 
Was meist mit drauf multiplizieren.
Du gibst in der Methode etwas zurück aber es wird nicht benutzt.


Wenn du nicht verstehst was deine Methode rechnet nimm Stift und Papier mache es Schritt für Schritt von Hand.
 
Wann muss ich die 2 draufmultiplizieren soll ich die rekursiven Aufrufe voneinander abziehen, kann ich das und wenn ja wie?
Was das angeht: Die Operatoren haben eine Rangfolge und die ist Dir doch bestimmt aus der Mathematik bekannt. Und da kommen erst Klammern und dann kommt Punkt vor Strichrechnung. Ansonsten links nach rechts.

2 * (f(x + 1, y - 3) - f(x - 3, y)) + 1;
Also Rangfolge hier ist:
1. Auswertung f(x + 1, y - 3) ==> Hier kommen auch die ganzen Rekursiven Aufrufe!
2. Auswertung f(x - 3, y) ==> Das kommt erst, nachdem 1. erledigt ist.
3. Subtraktion der Ergebnisse
4. Multiplikation mit 2
5. Addition von 1
 
Was das angeht: Die Operatoren haben eine Rangfolge und die ist Dir doch bestimmt aus der Mathematik bekannt. Und da kommen erst Klammern und dann kommt Punkt vor Strichrechnung. Ansonsten links nach rechts.

2 * (f(x + 1, y - 3) - f(x - 3, y)) + 1;
Also Rangfolge hier ist:
1. Auswertung f(x + 1, y - 3) ==> Hier kommen auch die ganzen Rekursiven Aufrufe!
2. Auswertung f(x - 3, y) ==> Das kommt erst, nachdem 1. erledigt ist.
3. Subtraktion der Ergebnisse
4. Multiplikation mit 2
5. Addition von 1
Richtig aber 3 4 u 5 wird nicht ausgehen.
 
Sorry den Baum jetzt am Handy zu zeichnen habe es versucht ist zu umständlich.
So sieht die Aufrufhierarchie aus:
Code:
┌─f(5, 4)
│ ┌─f(6, 1)
│ │ ┌─f(7, -2)
│ │ └─return 1
│ │ ┌─f(3, 1)
│ │ │ ┌─f(4, -2)
│ │ │ └─return 1
│ │ │ ┌─f(0, 1)
│ │ │ └─return 2
│ │ └─return -1
│ └─return 5
│ ┌─f(2, 4)
│ │ ┌─f(3, 1)
│ │ │ ┌─f(4, -2)
│ │ │ └─return 1
│ │ │ ┌─f(0, 1)
│ │ │ └─return 2
│ │ └─return -1
│ │ ┌─f(-1, 4)
│ │ └─return 2
│ └─return -5
└─return 21
 
Ach so - "wird nicht ausgegeben" meintest Du. Danke und ja - das ist natürlich richtig - die Zeile gibt nichts aus (außer ggf. Ausgaben innerhalb der rekursiven Aufrufe). Wenn man das wollte, dann müsste man die Zeile ggf.aufsplitten
 

Zurück
Oben