Rekursiven Stack

Snaer

Aktives Mitglied
Guten Tag,

Ich möchte gerne die Ausgabe von folgenden Code nachvollziehen:
Code:
public class Recursive {
    
    public static void main(String[] args) {
        calc(3);
    }
    
    public static void calc(int n) {
        if(n <= 0) return;
        calc(n-1);
        System.out.print(n);
        calc(n-2);
        System.out.print(n);
    }   
}
Bei einem anderen Beispiel mit nur einem rekursiven Aufruf und nur einem print Aufruf empfand ich es als ziemlich leicht zu durchschauen weswegen die Ausgabe aussieht wie sie es tat. Jedoch verwirrt mich die Ausgabe bei diesem Code. Mit dem Wert 3 erhält man damit 11223113.
Mich verwirrt dabei wie genau der Code nun vorgeht, die Methode ruft sich ja immer wieder selbst auf bis n = 0 ist, bei dem Beispiel mit 3.
Wird dabei nun der erste rekursive Ausdruck solange durch geführt bis die 3 auf 0 ist und danach der 2.? Oder werden die beiden nacheinander ausgeführt und beginnt die Methode dann wieder von vorne?
 

LimDul

Top Contributor
Gehen wir das doch mal Zeilenweise durch.

Aufruf von calc mit n = 3
Tiefe 1, Zeile 1: Bedingung falsch, wird weiter ausgeführt
Tiefe 1, Zeile 2: Aufruf von calc mit n = 2 => Ab in Tiefe 2
Tiefe 2, Zeile 1: Bedingung falsch, wird weiter ausgeführt
Tiefe 2, Zeile 2: Aufruf von calc mit n = 1 => Ab in Tiefe 3
Tiefe 3, Zeile 1: Bedingung falsch, wird weiter ausgeführt
Tiefe 3, Zeile 2: Aufruf von calc mit n = 0 => Ab in Tiefe 4
Tiefe 4, Zeile 1: Bedingung war, Rücksprung in Tiefe 3
Tiefe 3, Zeile 3: Ausgabe von n ( ist hier 1)
Tiefe 3, Zeile 4_ Aufruf von clac mit n = -1 => Ab in Tiefe 4
Tiefe 4, Zeile 1: Bedingung war, Rücksprung in Tiefe 3
Tiefe 3, Zeile 5: Ausgabe von n ( ist hier 1), Methode zuende, Rücksprung in Tiefe 2
Tiefe 2, Zeile 3: Ausgabe von n (ist hier 2)
Tiefe 2, Zeile 4: Aufruf von calc mit n=0 => Ab in Tiefe 3
Tiefe 3, Zeile 1: Bedingung war, Rücksprung in Tiefe 2
Tiefe 2, Zeile 5: Ausgabe von (ist hier 2)), Methode zuende, Rücksprung in Tiefe 1
Tiefe 1, Zeile 3: Ausgabe von n (ist hier 3)
Tiefe 1, Zeile 4: Aufruf von calc mit n=1 => Ab in Tiefe 2
Tiefe 2, Zeile 1: Bedingung falsch, wird weiter ausgeführt
usw.
 

Snaer

Aktives Mitglied
Also wenn ich es richtig verstanden habe durchläuft der Code zunächst den ersten rekursiven Aufruf und dann anschließend mit den einzelnen Ergebnissen der ersten Zeile dann den 2. Aufruf bis alle möglichen Werte > 0 durch sind ?
 

Blender3D

Top Contributor
Ich möchte gerne die Ausgabe von folgenden Code nachvollziehen:
Der folgende Code verdeutlicht die Aufrufreihenfolge. "F" steht für den 1ten Funktionsaufruf und "S" für den 2ten.
Java:
public class Recursive {
    public static int cntFirst = 0;
    public static int cntSecond = 0;
    public static String out = "";

    public static void main(String[] args) {
        calc(3);
        System.out.println("\n" + out);
    }

    public static void calc(int n) {
        if (n <= 0)
            return;
        System.out.println("1. calc()\t" + cntFirst);
        System.out.println("2. calc()\t" + cntSecond);
        System.out.println("number\t" + n);
        System.out.println("------------------");
        cntFirst++;
        calc(n - 1);
        out += " F"+n;
        cntSecond++;
        calc(n - 2);
        out += " S"+n;
    }
}

Ergbnis: F1 S1 F2 S2 F3 F1 S1 S3
 

Plauzi92

Aktives Mitglied
Wenn ich das richtig verstanden habe müsste der Aufrufstack der Funktion also folgerndermaßen aussehen:

s = []
s = [calc(3)]
s = [calc(3), calc(2)]
s = [calc(3), calc(2), calc(1)]
s = [calc(3), calc(2), calc(1), calc(0)]
s = [calc(3), calc(2), calc(1),]
s = [calc(3), calc(2), calc(1), calc(-1)]
s = [calc(3), calc(2), calc(1)]
s = [calc(3), calc(2)]
s = [calc(3), calc(2), calc(0)]
s = [calc(3), calc(2)]
s = [calc(3)]
s = [calc(3), calc(1)]
s = [calc(3), calc(1), calc(-1)]
s = [calc(3), calc(1)]
s = [calc(3)]
s = []
 

Meniskusschaden

Top Contributor
Wenn ich das richtig verstanden habe müsste der Aufrufstack der Funktion also folgerndermaßen aussehen:
Meines Erachtens fehlt da ein Aufruf von calc(0). Habe ich hier mal eingefügt:
Code:
s = []
s = [calc(3)]
s = [calc(3), calc(2)]
s = [calc(3), calc(2), calc(1)]
s = [calc(3), calc(2), calc(1), calc(0)]
s = [calc(3), calc(2), calc(1),]
s = [calc(3), calc(2), calc(1), calc(-1)]
s = [calc(3), calc(2), calc(1)]
s = [calc(3), calc(2)]
s = [calc(3), calc(2), calc(0)]
s = [calc(3), calc(2)]
s = [calc(3)]
s = [calc(3), calc(1)]
s = [calc(3), calc(1), calc(0)] // Dieser Aufruf fehlt
s = [calc(3), calc(1)]          // und deshalb fehlt auch diese Zeile
s = [calc(3), calc(1), calc(-1)]
s = [calc(3), calc(1)]
s = [calc(3)]
s = []
Hier ist noch mal eine andere Darstellung:
12964
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Mit rekursiven Aufrufen einen Stack emulieren Java Basics - Anfänger-Themen 1
berserkerdq2 Wo geschieht der "Rücksprung, bei der rekursiven Folge Java Basics - Anfänger-Themen 5
H Den Wert einer rekursiven Funktion bestimmen Java Basics - Anfänger-Themen 5
R Implementieren einer iterativen und rekursiven Klassenmethode. Java Basics - Anfänger-Themen 1
B Hilfe bei einer rekursiven Methode Java Basics - Anfänger-Themen 3
I Labyrinth auf der Basis eines rekursiven Algorithmus Java Basics - Anfänger-Themen 27
C Rekursiven Programmcode verändern Java Basics - Anfänger-Themen 11
MiMa abbruch innerhalb einer Rekursiven Schleife Java Basics - Anfänger-Themen 5
S Hilfe bei Fehlerfindung einer rekursiven Methode Java Basics - Anfänger-Themen 2
X Probleme beim rekursiven Durchsuchen von Verzeichnissen Java Basics - Anfänger-Themen 1
D Methode mit mehren Rekursiven aufrufen in Methode mit einem Rekursiven Aufruf umwandeln! Java Basics - Anfänger-Themen 1
B JavaKara rekursiven Teppich erstellen??? Java Basics - Anfänger-Themen 5
S Frage zu einer rekursiven Funktion Java Basics - Anfänger-Themen 28
timbeau Endergebnis einer rekursiven Methode Java Basics - Anfänger-Themen 11
G List als Rückgabewert einer rekursiven Methode (Baum) Java Basics - Anfänger-Themen 3
E Mehrfache print ausgabe ohne Schleife oder Rekursiven aufruf? Java Basics - Anfänger-Themen 48
D Problem bei einer Rekursiven Methode Java Basics - Anfänger-Themen 2
A Beschränkung der Anzahl der rekursiven Aufrufe einer Methode Java Basics - Anfänger-Themen 4
A stack Java Basics - Anfänger-Themen 14
Proxy Stack erweitern mit neuem Array falls der alte voll ist!? Java Basics - Anfänger-Themen 5
V Ist Off-Heap-Speicher dasselbe wie Stack-Speicher? Java Basics - Anfänger-Themen 2
izoards Stack... Java Basics - Anfänger-Themen 17
Csircc Rekursive Methode Stack Overflow Java Basics - Anfänger-Themen 10
B Zahlenfolge von Queue in Stack Java Basics - Anfänger-Themen 29
L Stack bilden, push und pop Java Basics - Anfänger-Themen 16
KogoroMori21 Stack und Heap Speicher Java Basics - Anfänger-Themen 1
G Stack und Queue Arbeitsblatt Java Basics - Anfänger-Themen 3
G Stack programmieren Java Basics - Anfänger-Themen 6
Z Datentypen Stack based calculator Java Basics - Anfänger-Themen 8
F speicherort stack oder heap Java Basics - Anfänger-Themen 1
Curtis_MC Collections Zufälliges Element aus Stack Java Basics - Anfänger-Themen 2
D Queue vs. Stack Java Basics - Anfänger-Themen 6
P Stack, Heap Java Basics - Anfänger-Themen 13
D Erste Schritte Stack im Rollenspiel Java Basics - Anfänger-Themen 76
J Stack mit Benutzereingabe Java Basics - Anfänger-Themen 17
J Liste,Queue,Stack sortieren Java Basics - Anfänger-Themen 2
C Stack und Queue in Aktion (Bitte Hilfe für die Klausur) Java Basics - Anfänger-Themen 7
S Sequenz von Zahlen bei einem Stack möglich oder nicht möglich? Java Basics - Anfänger-Themen 5
E Stack vs Queue - Gemeinsamkeiten / Unterschiede Java Basics - Anfänger-Themen 7
C Laufzeit von Stack Operation Java Basics - Anfänger-Themen 5
4 Stack over flow bei rekursiver Tiefensuche Java Basics - Anfänger-Themen 5
J Quicksort mit Stack Java Basics - Anfänger-Themen 4
A Anzahl der Elemente in einem Stack wiedergeben Java Basics - Anfänger-Themen 3
T Stack Overflow - Rekursive Fibonacci Java Basics - Anfänger-Themen 10
K Tiefen- und Breitensuche beim Baum durch Stack und Warteschlange Java Basics - Anfänger-Themen 1
L Liste mittels Stack implementieren Java Basics - Anfänger-Themen 0
A Stack programmieren -> Unklarheiten Java Basics - Anfänger-Themen 1
C Stack - listenbasierte Implementierung Java Basics - Anfänger-Themen 4
T Frage zu Java Stack Java Basics - Anfänger-Themen 5
D Stack-Objekt - LIFO - wait(); notify(); Java Basics - Anfänger-Themen 0
J Array von Objekten, wie schauts im Heap / Stack aus ? Java Basics - Anfänger-Themen 7
M Frage zu Stack und Heap Java Basics - Anfänger-Themen 1
Farbenfroh Suche Übungsaufgaben: BinaryTree, Stack Java Basics - Anfänger-Themen 0
D Aufgabe: Stack mit Iterator Java Basics - Anfänger-Themen 8
X Stack mit Oberklasse, wieso funktioniert es nicht? Java Basics - Anfänger-Themen 8
B Stack/Heap Frage Java Basics - Anfänger-Themen 36
K Probleme mit stack Java Basics - Anfänger-Themen 7
K Wofür wird heute noch die Stack Klasse in Java genutzt Java Basics - Anfänger-Themen 4
F Rekursion Tiefensuch-Problem - Stack Overflow Java Basics - Anfänger-Themen 9
P LinkedList - Stack ... grundlegende Frage Java Basics - Anfänger-Themen 5
B Stack in eine verkettete Liste pushen Java Basics - Anfänger-Themen 4
J OOP Warum braucht man den Stack Java Basics - Anfänger-Themen 3
B Queue mit Daten aus einem Stack füllen Java Basics - Anfänger-Themen 21
G Stack invertieren Java Basics - Anfänger-Themen 3
H Pseudo-Stack (char[] stackArray) mit Zeichen aus einer .txt-Datei befüllen Java Basics - Anfänger-Themen 5
S Stack Problem mit Objekt Java Basics - Anfänger-Themen 2
X String mit String von Objekt im Stack vergleichen? Java Basics - Anfänger-Themen 14
D Stack auslesen mit pop Java Basics - Anfänger-Themen 2
S Stack als verkettete liste/ toString methode Java Basics - Anfänger-Themen 3
S Exceptions bei push/pop in Stack Java Basics - Anfänger-Themen 8
S Eigene Stack Klasse Java Basics - Anfänger-Themen 26
S Stack: Klasseninvariante Java Basics - Anfänger-Themen 4
L OOP Wrapper Klassen - Stack-Aufgabe Java Basics - Anfänger-Themen 2
M Frage zu Stack Java Basics - Anfänger-Themen 3
D Problem mit Set, Stack und Random Java Basics - Anfänger-Themen 2
O Stack Implementierung als verkettete Liste Java Basics - Anfänger-Themen 8
T Probleme bei einen Stack der über drei Dateien funktionieren soll Java Basics - Anfänger-Themen 5
V java.util.Stack Java Basics - Anfänger-Themen 9
K Stack und immer gleiches Objekt Java Basics - Anfänger-Themen 11
kulturfenster Stack / Queue Implementationen Java Basics - Anfänger-Themen 11
S Stack einlesen. Java Basics - Anfänger-Themen 2
E Stack kann nicht implimentiert werden Java Basics - Anfänger-Themen 11
E Eigene Stack Klasse schreiben Java Basics - Anfänger-Themen 12
J Stack Java Basics - Anfänger-Themen 3
K min-int-Wert in'nem Stack Java Basics - Anfänger-Themen 8
L Stack UpnRechner Java Basics - Anfänger-Themen 4
B Stack mit Bildern füllen Java Basics - Anfänger-Themen 2
B Stack mit Strings in zufälliger Reihenfolge füllen Java Basics - Anfänger-Themen 4
J Stack, der Integer-Zahlen enthält Java Basics - Anfänger-Themen 3
K Array Stack Java Basics - Anfänger-Themen 6
O Stack-Klasse Java Basics - Anfänger-Themen 7
S Stack mit Arrays Java Basics - Anfänger-Themen 3
T generischer stack Java Basics - Anfänger-Themen 3
Z Keller/Stack Problem Java Basics - Anfänger-Themen 11
H Stack und Queue Java Basics - Anfänger-Themen 6
M Stack SetValTop Java Basics - Anfänger-Themen 6
G Die Klasse Stack selber schreiben. Java Basics - Anfänger-Themen 2
F Klammertest mit Stack implementieren Java Basics - Anfänger-Themen 5
X Stack Java Basics - Anfänger-Themen 14
J Morgen Java-Klausur. Stack, Heap, Method-Area Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben