Verständnis zu einem Rekursionsbeispiel

easyJAVA?

Mitglied
Hallo,
Java:
public static void main(String[] args){
		        rekursion(4);
		    }
		    public static void rekursion(int a){
		       a--;
		        System.out.println(a);
		        if (a!=0) rekursion(a);
		        System.out.println(a);
}

Ausgabe ist
3
2
1
0 und bis hier hin verstehe ich warum das ausgegeben wird.
0 ab hier nicht mehr.
1
2
3

Warum wird die 0 nochmal ausgegeben und warum wird wieder hochgezählt? ist ja ganz klar ein a--

Danke.
 

Michael...

Top Contributor
Hoffe der Code ist bei Dir besser eingerückt.

Gehe doch einfach mal den Ablauf im Kopf oder auf Papier durch.
- die Methode wird mit einem Wert aufgerufen
- der übergebene Wert (Kopie des Wertes) wird um eins reduziert und ausgegeben.
- falls der Wert nicht 0 ist wird die Methode rekursiv aufgerufen.
Dadurch kommt es zu der für Dich noch verständlichen Ausgabe von 3, 2, 1, 0

Allerdings ist damit die Methode noch nicht fertig. Wenn der rekursive Aufruf abgeschlossen ist wird der ursprüngliche Wert ja nochmals ausgegeben daher das 0, 1, 2, 3
 

Kiri

Bekanntes Mitglied
Java:
    public static void rekursion(int a){
        a--;
        System.out.println(a);
        
        if (a!=0){
            rekursion(a);
        }
        //nach der rekursion
        System.out.println(a);
    }
 

stikio

Mitglied
Gehe doch einfach mal den Ablauf im Kopf oder auf Papier durch.

den rat solltest du dir zu herzen nehmen, solch einfache beispiele solltest du schon früh verstehen, sonst versteht man dinge die auf sowas aufbauen nicht mehr.

schreib dir einfach auf papier auf wie die schleife durchlaufen wird und du lernst zimelich viel, wie das ganze funktioniert :)
 

VfL_Freak

Top Contributor
Moin,

vielleicht wird es ja klarer, wenn Du in Deinem Code mal 'ne Klammer setzt :
Java:
public static void rekursion( int a )
{
    a--;
    System.out.println( a );
    if( a!=0 ) 
    { // !!
        rekursion( a );
    } // !!

    System.out.println(a);
}

Gruß
Klaus
 

MarderFahrer

Gesperrter Benutzer
Solange man nicht schon vorher weiß, wie rekursion funktioniert, wird einem auch das durchgehen auf Papier nicht viel bringen.

Damit kommt man nämlich genausoweit, wie der TO es bereits beschrieben hat. Da nützen auch die extra Klammern nichts, da dieser Teil des Codes bereits vom TO verstanden wurde.
Geht man die Methode Zeilenweise durch, so kommt man so weit:
3
2
1
0

An dieser Stelle müsste man wieder bei der If-Anweisung sein. Und diesmal ist sie nicht True, da a==0 ist.
Also wird die Methode nicht erneut aufgerufen.
Und wenn man jetzt nicht weiß, wie Rekursion funktioniert, kommt man Zeilenweise auf Papier nur noch zu einer System.out.println Anweisung und dann ist die Methode Augenscheinlich zu Ende und das Programm "sollte" anhalten.

Erst im Debugger sieht man, dass diese letzte System.out zusätzlich noch drei mal aufgerufen wird.
Ich wüsste nicht, wie man sich das selbst beibringen sollte, indem man das ganze auf Papier durchgeht.
 

Landei

Top Contributor
Code:
rekursion(4)

bewirkt folgendes:

Code:
println(3) //in rekursion(4)
rekursion(3) //in rekursion(4)
println(3) //in rekursion(4)

Verfolgt man den Aufruf von rekursion(3) weiter, hat man:
Code:
println(3) //in rekursion(4)
println(2) //in rekursion(3)
rekursion(2) //in rekursion(3)
println(2) //in rekursion(3)
println(3) //in rekursion(4)

Verfolgt man den Aufruf von rekursion(2) weiter, hat man:
Code:
println(3) //in rekursion(4)
println(2) //in rekursion(3)
println(1) //in rekursion(2)
rekursion(1) //in rekursion(2)
println(1) //in rekursion(2)
println(2) //in rekursion(3)
println(3) //in rekursion(4)

Verfolgt man den Aufruf von rekursion(1) weiter, hat man:
Code:
println(3) //in rekursion(4)
println(2) //in rekursion(3)
println(1) //in rekursion(2)
println(0) //in rekursion(1)
//if-Bedingung trifft nicht mehr zu in rekursion(1)
println(0) //in rekursion(1)
println(1) //in rekursion(2)
println(2) //in rekursion(3)
println(3) //in rekursion(4)

Alles klar?
 

Rallenaldo

Mitglied
Sorry das ich den Thread nochmal hochhole, aber ich wollte keinen neuen starten.

Ich hab das Beispiel soweit glaube ich verstanden.

Es werden die Zahlen 321 ausgegeben, weil das die erste Print-Anweisung ausgeben soll.
Die 2. Anweisung ist dann die if Anweisung, die sagt, dass rekursion(a) nochmals gestartet werden soll, wenn Variable "a" ungleich 0 ist.

Wenn n==0 ist, ist der Ausstiegspunkt erreicht und es soll erneut die Variable "a" ausgegeben werden.

Da "a" aber inzwischen mehrere Werte hatte, gibt er diese Werte alle nochmals aus und beginnt bei dem Wert, den "a" als letztes hatte.

Hab ich das richtig verstanden?
 
H

hüteüberhüte

Gast
Naja, es werden nacheinander die gleiche Methode nochmals aufgerufen, immer mit neuen Werten.

Aufruf 1: a==3, sout(3), weiter mit Aufruf 2, danach sout(3),
Aufruf 2: a==2, sout(2), weiter mit Aufruf 3, danach sout(2),
Aufruf 3: usw.

Jetzt klar?
 

Rallenaldo

Mitglied
Also bedeutet das folgendes:

Für a=4:

Java:
System.out.println(a);     //3
if (a!=0) rekursion(a);     // Rekursion a wird wieder gestartet
System.out.println(a);     //3

Für a=3:

Java:
System.out.println(a);     //3 <-- Ausgabewert aus a=4
System.out.println(a);     //2 <-- Ausgabewert aus a=3
if (a!=0) rekursion(a);     // Rekursion a wird wieder gestartet
System.out.println(a);     //2 <-- Ausgabewert aus a=3
System.out.println(a);     //3 <-- Ausgabewert aus a=4

Für a= 2:

Java:
System.out.println(a);     //3 <-- Ausgabewert aus a=4
System.out.println(a);     //2 <-- Ausgabewert aus a=3
System.out.println(a);     //1 <-- Ausgabewert aus a=2
if (a!=0) rekursion(a);     // Rekursion a wird wieder gestartet
System.out.println(a);     //1 <-- Ausgabewert aus a=2
System.out.println(a);     //2 <-- Ausgabewert aus a=3
System.out.println(a);     //3 <-- Ausgabewert aus a=4

Für a= 1:

Java:
System.out.println(a);     //3 <-- Ausgabewert aus a=4
System.out.println(a);     //2 <-- Ausgabewert aus a=3
System.out.println(a);     //1 <-- Ausgabewert aus a=2
System.out.println(a);     //0 <-- Ausgabewert aus a=1
if (a!=0) rekursion(a);     // Rekursionsende
System.out.println(a);     //0 <-- Ausgabewert aus a=1
System.out.println(a);     //1 <-- Ausgabewert aus a=2
System.out.println(a);     //2 <-- Ausgabewert aus a=3
System.out.println(a);     //3 <-- Ausgabewert aus a=4

Er geht so zu sagen den kompletten Code durch, wenn a!= 0 ist und das jeweils erste Ergebnis ist "außen" und die nachfolgenden berechnungen werden "innen" ausgegeben.
 
Zuletzt bearbeitet:
H

hüteüberhüte

Gast
Muss natürlich wird statt werden heißen. Eine sich selbst aufrufende Methode bedeutet einfach nur, dass die vor dem rekursiven Aufruf stehenden Anweisungen zuerst ausgeführt werden, dann Nebeneffekte entstehen können (nicht ganz das korrekte Wort) und schließlich die danachstehenden Anweisungen ausgeführt werden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Verständnis Problem bei Server/Client Java Basics - Anfänger-Themen 2
N Verständnis Frage zu Variablen Java Basics - Anfänger-Themen 3
KogoroMori21 Polymorphie-Verständnis Java Basics - Anfänger-Themen 5
S Verständnis-Frage zu einer HÜ? Java Basics - Anfänger-Themen 1
NeoLexx equals()-Methode Verständnis Frage anhand Code Beispiel Java Basics - Anfänger-Themen 22
B Frage zum Code verständnis im Resultat Java Basics - Anfänger-Themen 10
T Methoden Verständnis Java Basics - Anfänger-Themen 14
M Java Code Verständnis Java Basics - Anfänger-Themen 4
M Java Code Verständnis Java Basics - Anfänger-Themen 2
M Fehlendes Verständnis für dynamische Bindung und Vererbung Java Basics - Anfänger-Themen 13
K nur für das verständnis Java Basics - Anfänger-Themen 3
B Verständnis Frage zu der Aufgabe Java Basics - Anfänger-Themen 30
S Verständnis Vererbung Java Basics - Anfänger-Themen 3
J Code Verständnis Java Basics - Anfänger-Themen 9
B Problem beim grundsätzlichen Verständnis bei Rekursion mit 2-dimensionalen Array Java Basics - Anfänger-Themen 6
Y MVC MouseEvent Verständnis Java Basics - Anfänger-Themen 24
W Verständnis Probleme bei der while-Schleife und continue Java Basics - Anfänger-Themen 21
M If Verständnis Problem Java Basics - Anfänger-Themen 2
J Verständnis Problem Java-Listener. Java Basics - Anfänger-Themen 59
D Hilfe bei Verständnis von Aufgabe Java Basics - Anfänger-Themen 1
I Verständnis Frage wegen einer Aufgabe Java Basics - Anfänger-Themen 10
P verständnis Frage Refernzen und Objekte Java Basics - Anfänger-Themen 1
S Verständnis - Frage mehrere SQL Statements in While Schleife Java Basics - Anfänger-Themen 0
J java syntax verständnis Java Basics - Anfänger-Themen 6
M Verständnis von Deadlocks Java Basics - Anfänger-Themen 2
C Klassen/Objekte Verständnis Java Basics - Anfänger-Themen 8
O Singleton Verständnis Java Basics - Anfänger-Themen 4
C Allgemeines Verständnis For-Schleife Java Basics - Anfänger-Themen 3
vodkaz For Schleife Verständnis Problem Java Basics - Anfänger-Themen 4
R Input/Output MVC - Frage zum Verständnis Java Basics - Anfänger-Themen 5
G regex Verständnis Problem Java Basics - Anfänger-Themen 3
B Hilfe beim Verständnis zu Generics Java Basics - Anfänger-Themen 7
J Musterlösung Verständnis Frage zu Math.abs() Java Basics - Anfänger-Themen 5
R RandomAccessFile verständnis Problem Java Basics - Anfänger-Themen 10
M Erste Schritte Verständnis Problem Konstruktoren Java Basics - Anfänger-Themen 13
X Kompilat verständnis Frage Java Basics - Anfänger-Themen 9
C Input/Output Anfänger Array-Verständnis Frage Java Basics - Anfänger-Themen 7
H Überladen Verständnis Java Basics - Anfänger-Themen 3
J Compiler-Fehler Verständnis Problem bei Compiler-Warning Java Basics - Anfänger-Themen 7
F Verständnis Frage - && Java Basics - Anfänger-Themen 2
S Timer / Schleifen Verständnis Problem Java Basics - Anfänger-Themen 3
O Frage zu Verständnis von Collection Java Basics - Anfänger-Themen 4
JavaKaffee Minimax-Algorithmus Verständnis Java Basics - Anfänger-Themen 12
C Methoden Frage zu Verständnis eines Beispiels Java Basics - Anfänger-Themen 3
M Polymorphie Cast:Verständnis und Ausführung Java Basics - Anfänger-Themen 10
M Verständnis Frage Java Basics - Anfänger-Themen 11
M Verständnis-Probleme mit eigenen Klassen Java Basics - Anfänger-Themen 2
T Verständnis von "final" und "static" Java Basics - Anfänger-Themen 6
U ADT verständnis Problem Java Basics - Anfänger-Themen 18
S Java Verständnis Problem Methoden etc. Java Basics - Anfänger-Themen 22
F ArrayList() Verständnis Java Basics - Anfänger-Themen 14
M Verständnis von PrintWriter Java Basics - Anfänger-Themen 12
M Verständnis einiger Zeilen Java Basics - Anfänger-Themen 4
P Codeschnipsel Verständnis Problem (Array) Java Basics - Anfänger-Themen 6
F Groovy Verständnis ConfigSlurper Java Basics - Anfänger-Themen 7
H Verständnis Strategy Pattern Java Basics - Anfänger-Themen 4
A Dringende Bitte um Erklärungen zum besseren Verständnis Java Basics - Anfänger-Themen 4
J Verständnis Problem mit return --> Klausuraufgabe Java Basics - Anfänger-Themen 4
deimosmuc Hilfe zum Verständnis bei Vererbung Java Basics - Anfänger-Themen 11
T Verständnis-Frage Java Basics - Anfänger-Themen 2
F (Verständnis)Problem: Zahl auf 2 Nachkommastellen runden Java Basics - Anfänger-Themen 5
E Verständnis frage zum return wert eines Arrays Java Basics - Anfänger-Themen 7
S Frage zu Verständnis und Logik Java Basics - Anfänger-Themen 5
P Verständnis bzgl. MVC Java Basics - Anfänger-Themen 11
M Klassen und Objekte => richtiges Verständnis? Java Basics - Anfänger-Themen 6
B Exception verständnis Problem Java Basics - Anfänger-Themen 2
V KSKB zum Verständnis von Graphics und paintComponent Java Basics - Anfänger-Themen 6
A Array Verständnis Frage Java Basics - Anfänger-Themen 4
L Hashtable Verständnis Frage Java Basics - Anfänger-Themen 4
M Verständnis-Problem Java Basics - Anfänger-Themen 4
H Verständnis: Methode Java Basics - Anfänger-Themen 2
Z Verständnis Java Basics - Anfänger-Themen 4
R Verständnis Java Basics - Anfänger-Themen 4
R Verständnis bei Listen Java Basics - Anfänger-Themen 2
R Verständnis Klassen Java Basics - Anfänger-Themen 9
K Mehrere Werte in einem Switch Case parallel überprüfen Java Basics - Anfänger-Themen 23
Zrebna Fragen zu einem Klassendiagramm Java Basics - Anfänger-Themen 8
S HashMap mehrere Keys zu einem Value Java Basics - Anfänger-Themen 3
S Java: Wie sortiere ich eine ArrayList benutzerdefinierter Objekte nach einem bestimmten Attribut? Java Basics - Anfänger-Themen 2
F 2x 16bit Werte zu einem 32bit und dann splitten mit 0xb Java Basics - Anfänger-Themen 1
J JSON mit einem JPanel Java Basics - Anfänger-Themen 3
F Einem GIT repository ein Projekt hinzufügen Java Basics - Anfänger-Themen 1
J Frage zu einem "Taschenrechner" code Java Basics - Anfänger-Themen 9
I Klassen von einem package laden, Statisches Feld auslesen und Objekt erstellen Java Basics - Anfänger-Themen 8
J Schlüsselworte Prüfen, ob ein bestimmtes, ganzes Wort in einem String enthalten ist. Java Basics - Anfänger-Themen 6
P Probleme mit NetBeans: Wie lässt sich jar. Datei an einem MacBook öffnen Java Basics - Anfänger-Themen 21
J Auf einem JLabel Linien Malen Java Basics - Anfänger-Themen 1
I @Entity Klassen, Service Beans etc. aus einem Share Projekt beziehen? Java Basics - Anfänger-Themen 26
R Images aus einem Array ausgeben Java Basics - Anfänger-Themen 3
XWing Randomizer mit einem String Java Basics - Anfänger-Themen 2
D OOP Array einem Objekt zuweisen Java Basics - Anfänger-Themen 2
O Zahlen aus einem char-array per char + Zeichen addieren Java Basics - Anfänger-Themen 2
S Bestimmte werte aus einem Array löschen Java Basics - Anfänger-Themen 2
S Ausgeben wie oft ein Wert in einem Array vorkommt Java Basics - Anfänger-Themen 7
N Einzelne Werte aus einem TreeSet auslesen Java Basics - Anfänger-Themen 2
N Welche Objekte kann man zu einem Set hinzufügen Java Basics - Anfänger-Themen 4
Kumora ArrayIndexOutOfBoundsException bei einem Sortierverfahren Java Basics - Anfänger-Themen 2
I Viereck / Rechteck Prüfung innerhalb einem bestimmten Bereich Java Basics - Anfänger-Themen 2
Distanz zwischen zwei Zeichenfolgen in einem String bestimmen Java Basics - Anfänger-Themen 5
Substring in einem String finden Java Basics - Anfänger-Themen 13

Ähnliche Java Themen

Neue Themen


Oben