Rekursion: Verständnisprobleme

Status
Nicht offen für weitere Antworten.

Stack

Mitglied
Code:
public class RekursionDemo{
public static void main(String[] args){
rekursion(5);
}
private static void rekursion(int a){
a--;
System.out.println(a);
if (a!=0) rekursion(a);
System.out.println(a);
}
}

Ausgabe ist wie nicht anders erwartet!
4
3
2
1
0
0
1
2
3
4

WARUM???
Wieso wird wird nach der ersten Null wieder hochgezählt??
Ich verstehe die Rekursion überhaupt nicht
 

Jaraz

Bekanntes Mitglied
Stack hat gesagt.:
Code:
public class RekursionDemo{
public static void main(String[] args){
rekursion(5);
}
private static void rekursion(int a){
a--;
System.out.println(a);
if (a!=0) rekursion(a);
System.out.println(a);
}
}

Ausgabe ist wie nicht anders erwartet!
4
3
2
1
0
0
1
2
3
4

WARUM???
Wieso wird wird nach der ersten Null wieder hochgezählt??
Ich verstehe die Rekursion überhaupt nicht

Schönes Beispiel, daran kannste schön einen Debugger testen.

Das erste System.out.println gibt 43210 aus. Direkt danach wird rekursiv wieder die Funktion aufgerufen, bis die Abbruch Bedingung a==0 erreicht wird. Danach gibt das zweite System.out.println, das ganze jeweils noch mal rückwärts aus.
Es wird also nicht hochgezählt sondern a jeweils nochmal ausgegeben, wobei als erstes der innerste Rekursions Aufruf sein a ausgibt.

Gruß Jaraz
 

Stack

Mitglied
Ok danke es hört sich gut an und ich habe es fast verstanden aber dennoch habe ich eine Frage

Es wird also nicht hochgezählt sondern a jeweils nochmal ausgegeben


die Funktion rekursion() geht so dass a von 5 heruntergezählt wird.
Und demnach sollte doch die Ausgabe so ausschauen 4 3 2 1 0 4 3 2 1 0



Code:
private static void rekursion(int a){ 
a--; 
System.out.println(a); 
if (a!=0) rekursion(a); 
System.out.println(a); 
} 
}
 
G

Guest

Gast
Moin,

wie Jaraz schon erwähnte, gibt nach Erreichen der Abbruchbedingung erst der innerste Aufruf sein a wieder aus, danach der, der davor aufgerufen wurde.

Die Rekursion wird quasi rückwärts wieder aufgelöst.

Grüße
radio
 

Stack

Mitglied
Moin moin
also kann demnach sagen dass eine Rekursion zu guter Letzt immer das ganze jeweils noch mal
rückwärts ausgibt oder was?
Was soll das für einen Sinn machen?

Grüße
 

radio

Mitglied
Der Knackpunkt hier ist dein zweites System.out nach dem rekursiven Aufruf von rekursion.

Wenn der Aufruf zurückkommt wird natürlich ganz normal der nächste Befehl ausgeführt, der in deinem Fall das System.out ist, danach wird die Methode beendet und die nächste wird "abgebaut". Klaro ;-)

Grüße
radio
 

Stack

Mitglied
Ok Ok !
Was ist damit, wann wird der Bereich mit
Code:
         a[j]     = true;       
         b[i+j]   = true;
         c[i-j+N] = true;
ausgeführt und wann der Bereich
Code:
         a[j]     = false;       
         b[i+j]   = false;
         c[i-j+N] = false;

Code:
public class AchtDamen 
{
  
  static int     N = 8;  // Anzahl der Damen
  static int     x[];    // Positionen der Damen 
  static boolean a[];    // Reihen               
  static boolean b[];    // /-Diagonalen         
  static boolean c[];    // \-Diagonalen         

  public static void print() 
  {         
    for( int k=1; k <= N; k++) 
    {
      System.out.print( x[k] + " " );
    }
    System.out.println();
   
  }

  public static void nextPosition(int i) 
  {
    int j;
    for( j=1; j <= N; j++ ) {
      if (a[j] && b[i+j] && c[i-j+N]) {
       
         x[i] = j; 
         
         a[j]     = false;       
         b[i+j]   = false;
         c[i-j+N] = false;
      
         if (i < N)   nextPosition(i+1);   
         else         print();         

         a[j]     = true;       
         b[i+j]   = true;
         c[i-j+N] = true;
         
      }
    }
  }

  public static void main( String argv[] ) { 
    if (argv.length > 0) 
    {
       N = Integer.parseInt( argv[0] );
    }
    System.out.println( 
     "Alle Loesungen des " + N + "-Damen Problems:" );
    x = new int[N+1]; //9
    a = new boolean[N+1]; //9
    b = new boolean[2*N+1]; //17
    c = new boolean[2*N+1]; //17
 
    int i;        // zu Beginn alles frei:
    for( i=1; i <= N;  i++)  a[i] = true; 
    for( i=1; i <= 2*N; i++) b[i] = true;
    for( i=1; i <= 2*N; i++) c[i] = true;
    
    nextPosition(1); 
    try   
    {   
    byte a[] = new byte[256]; 
    System.out.println(); 
    System.out.println(" Verlassen des Programms mit exit ");
    System.out.println(" Anzahl der Steine kann in start.bat veraendert werden ") ;
    System.in.read(a);   
    }   
    catch(Exception ex){} 
  
    
  }
}


EDIT von L-ectron-X: Code-Tags eingefügt.
 

Stack

Mitglied
Jaraz eins verstehe ich immer noch nicht ????
Direkt danach wird rekursiv wieder die Funktion aufgerufen, bis die Abbruch Bedingung a==0

Wo bitteschön ist da eine Funktion ? System.out.println(a) ist doch keine Funktion

Code:
public class RekursionDemo{ 
  public static void main(String[] args){ 
  rekursion(5); 
} 

private static void rekursion(int a){ 
  a--; 
  System.out.println(a); 
  if (a!=0) rekursion(a); 
  System.out.println(a); 
} 
}


EDIT von L-ectron-X: Code-Tags eingefügt.
 

Stack

Mitglied
OK akzeptiert!
Was mich bei der Sache verwirrt ist :
a wird dekrementiert bis 0 und solange nicht wird rekursion(a) aufgerufen

Code:
a--; 
System.out.println(a); 
if (a!=0) rekursion(a); 
System.out.println(a);

deswegen diese Ausgabe 4 3 2 1 0

und ab a = 0, wird rekursion(a) nichtmehr aufgerufen
und geht in die nächste Zeile und macht System.out.println(a)
und genau das 0 1 2 3 4 wird ausgegeben warum das ist doch
0 und schon garnicht fünf Zahlen zugleich. Was ist das Hexerei oder was???

Grüße
 
B

Beni

Gast
primitive Datentypen, wie a einer ist, werden bei einem Methodenaufruf kopiert.

Code:
rekursion(a); // hier wird in Wirklichkeit eine Kopier erstellt, und die Methode rekursion verwendet ein anderes a
 

flashfactor

Aktives Mitglied
Ein Rekursion ist eine hübsche Sache ich werds mal nur ein Beispiel mit 2 machen

Code:
public class RekursionDemo{
public static void main(String[] args){
rekursion(2);
}
private static void rekursion(int a){
a--;
System.out.println(a);
if (a!=0) rekursion(a);
System.out.println(a);
}
}

Das heisst im Speicher wird die Funklion 2mal erzeugt. Als Code würde es so aussehen.

Code:
public class RekursionDemo{
public static void main(String[] args){
rekursion1(2);
}
private static void rekursion1(int a){
a--;
System.out.println(a);
if (a!=0) rekursion2(a);
System.out.println(a);
}
private static void rekursion2(int a){
a--;
System.out.println(a);
if (a!=0) rekursion3(a);    //In diesem Fall egal
System.out.println(a);
}
}

So vielleicht verständlicher.

mfg Flashfactor
 

Isaac

Bekanntes Mitglied
Ich versuchs mal anders zu erklären


Du rufst deine Methode mit 5 auf:

Code:
private static void rekursion(int a){ 
  a--; 
  System.out.println(a); 
  if (a!=0) rekursion(a); 
  System.out.println(a); 
}


Jetzt wird:
(Rekursion Schritt 1 mit a = 5) a = 4 wird ausgegeben - rekursion(4) wird aufgerufen
__(Rekursion Schritt 2 mit a = 4) a = 3 wird ausgegeben - rekursion(3) wird aufgerufen
____(Rekursion Schritt 3 mit a = 3) a = 2 wird ausgegeben - rekursion(2) wird aufgerufen
______(Rekursion Schritt 4 mit a = 2) a = 1 wird ausgegeben - rekursion(1) wird aufgerufen
________(Rekursion Schritt 5 mit a = 1) a = 0 wird ausgegeben - rekursion(0) wird nicht aufgerufen
________(Rekursion Schritt 5) beendet nun seine routine und gibt a = 0 aus
______(Rekursion Schritt 4) beendet nun seine routine und gibt a = 1 aus
____(Rekursion Schritt 3) beendet nun seine routine und gibt a = 2 aus
__(Rekursion Schritt 2) beendet nun seine routine und gibt a = 3 aus
(Rekursion Schritt 1) beendet nun seine routine und gibt a = 4 aus



Ich hoffe das verdeutlicht das ganze ein bischen.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
K Verstehe Rekursion nicht ganz Java Basics - Anfänger-Themen 7
P Frage zu Rekursion und Backtracking Java Basics - Anfänger-Themen 2
DiyarcanZeren Rekursion in Java Java Basics - Anfänger-Themen 5
M Variablen Rekursion mit 2 Parameteren Java Basics - Anfänger-Themen 4
sserio Rekursion größten Primfaktor finden funktioniert nicht Java Basics - Anfänger-Themen 8
M Lösungsweg Rekursion Java Basics - Anfänger-Themen 1
C StackOverflow bei Rekursion Java Basics - Anfänger-Themen 7
D Rekursion - Ich raffs nicht Java Basics - Anfänger-Themen 16
N Methoden Rekursion mit Kreisen Java Basics - Anfänger-Themen 7
P9cman Vokale in einem String überprüfen mittels Rekursion Java Basics - Anfänger-Themen 8
J Rekursion Java Basics - Anfänger-Themen 22
T Rekursion Programmierverständnis Java Basics - Anfänger-Themen 12
K Rekursion: Rechenmauer mit Array erstellen Java Basics - Anfänger-Themen 17
K Rekursion einer Zahlenfolge (Ab- und Aufzählung) Java Basics - Anfänger-Themen 6
Zeppi Rekursion Java Basics - Anfänger-Themen 15
V Backtracking und Rekursion Java Basics - Anfänger-Themen 15
L REKURSION Java Basics - Anfänger-Themen 13
Kirby.exe Rekursion Java Basics - Anfänger-Themen 7
N for Schleife durch Rekursion ersetzen Java Basics - Anfänger-Themen 6
X Rekursion Java Basics - Anfänger-Themen 3
H Rekursion Java Basics - Anfänger-Themen 2
D Erste Schritte Rekursion Java Basics - Anfänger-Themen 13
M Rekursion Tage Ansteckung gesamte Bevölkerung Java Basics - Anfänger-Themen 15
M Java Rekursion Java Basics - Anfänger-Themen 9
G Java Rekursion Java Basics - Anfänger-Themen 5
J Rekursion Klausur Aufgabe Java Basics - Anfänger-Themen 2
N Rekursion Java Basics - Anfänger-Themen 18
M Verständnisproblem der Rekursion bei Arrays Java Basics - Anfänger-Themen 8
X Rekursion Rätsel Java Basics - Anfänger-Themen 4
N Klassen Rekursion mit Feldern von Objekten Java Basics - Anfänger-Themen 14
W Rekursion Java Basics - Anfänger-Themen 0
D Konsolenausgabe Zahlenfolge Rekursion Java Basics - Anfänger-Themen 3
J Ping Pong Methode mit Rekursion Java Basics - Anfänger-Themen 1
N Rekursion Java Basics - Anfänger-Themen 1
B Rekursion Basic Java Basics - Anfänger-Themen 15
O Rekursion Mergesort Java Basics - Anfänger-Themen 18
G Rekursion Java Basics - Anfänger-Themen 20
M Rekursion Java Basics - Anfänger-Themen 7
F Hilfe bei Rekursion... Java Basics - Anfänger-Themen 4
A Mit Rekursion Zufallszahlen erstellen und größte finden Java Basics - Anfänger-Themen 5
B Rekursion Wurzel Java Basics - Anfänger-Themen 39
O Rekursion ordentlich aufschreiben Java Basics - Anfänger-Themen 2
B Rekursion verstehen Java Basics - Anfänger-Themen 4
O Rekursion Java Basics - Anfänger-Themen 2
E Rekursion verstehen. Java Basics - Anfänger-Themen 4
E Rekursion Kisten befüllen Java Basics - Anfänger-Themen 10
E Rekursion verstehen Java Basics - Anfänger-Themen 2
O Rekursion, String Java Basics - Anfänger-Themen 8
N Invertierte Rekursion??? Java Basics - Anfänger-Themen 5
M Bitte um Hilfe bei Quellcode (Rekursion) Java Basics - Anfänger-Themen 6
T Rekursion Warum bricht meine Funktion nicht ab Java Basics - Anfänger-Themen 4
A Hilfe bei Rekursion,Ich verstehe nicht,wie funktioniert die Rekursion in der Methode "walk" Java Basics - Anfänger-Themen 13
L Rekursion im Baum Java Basics - Anfänger-Themen 9
E Pfade eines Baums angeben ohne Rekursion Java Basics - Anfänger-Themen 20
L Rekursion Baumknoten Java Basics - Anfänger-Themen 8
L Rekursion größtes Zeichen Java Basics - Anfänger-Themen 8
L Rekursion Modulo Java Basics - Anfänger-Themen 7
I Rekursion Java Basics - Anfänger-Themen 11
H Rekursion Java Basics - Anfänger-Themen 7
N Methoden zur Rekursion (catalansche Zahlen) Java Basics - Anfänger-Themen 4
S Frage zu Rekursion... Java Basics - Anfänger-Themen 15
N Java catalansche Zahlen (Rekursion) Java Basics - Anfänger-Themen 5
S Noch eine Frage zur Rekursion... Java Basics - Anfänger-Themen 11
S Frage zu einer Rekursion Java Basics - Anfänger-Themen 15
F Methoden Abbruchbedingung bei Rekursion Java Basics - Anfänger-Themen 2
Z Rekursion Primzahlen Java Basics - Anfänger-Themen 1
K Rekursion Verständnisfrage Java Basics - Anfänger-Themen 19
L Methoden Rekursion gibt alten Wert wieder Java Basics - Anfänger-Themen 37
M Rekursion Minimums Suche Java Basics - Anfänger-Themen 12
J Rekursion Java Basics - Anfänger-Themen 5
F Aufgabe Rekursion Binärer Baum Java Basics - Anfänger-Themen 15
N Rekursion Java Basics - Anfänger-Themen 2
B Rekursion - Übung Java Basics - Anfänger-Themen 2
B Problem beim grundsätzlichen Verständnis bei Rekursion mit 2-dimensionalen Array Java Basics - Anfänger-Themen 6
P Rekursion Java Basics - Anfänger-Themen 19
G Rekursion Beispiel Java Basics - Anfänger-Themen 3
M Rekursion schreiben Java Basics - Anfänger-Themen 16
A Rekursion Funktion in eine Iterativ Funktion umwandeln Java Basics - Anfänger-Themen 9
T Array Rekursion Java Basics - Anfänger-Themen 1
B lineare und schlichte Rekursion Java Basics - Anfänger-Themen 1
A Rekursion Java Basics - Anfänger-Themen 2
B Rekursion Java Basics - Anfänger-Themen 3
A Rekursion stoppt an der falschen Stelle Java Basics - Anfänger-Themen 4
A Lineare Rekursion Java Basics - Anfänger-Themen 6
P Hilfe zur Rekursion? Java Basics - Anfänger-Themen 2
B Rekursion Schneeflocke - Kurze Frage zur Methode Java Basics - Anfänger-Themen 11
L Rekursion Java Basics - Anfänger-Themen 4
S Rekursion Rückgabe - Türme von Hanoi Java Basics - Anfänger-Themen 16
kilopack15 Rekursion und Schleifen Java Basics - Anfänger-Themen 27
E Rekursion Java Basics - Anfänger-Themen 10
G rekursion nicht verstanden Java Basics - Anfänger-Themen 5
K Rekursion-Verständnisfrage Java Basics - Anfänger-Themen 4
E Methoden String wird in Rekursion nicht überschrieben Java Basics - Anfänger-Themen 2
T 2fach Rekursion. Java Basics - Anfänger-Themen 4
N Rekursion mit if-Anweisung Java Basics - Anfänger-Themen 10
K Methoden Zahlensysteme umwandeln mittels Rekursion Java Basics - Anfänger-Themen 5
H Rekursion Binäre Suche Java Basics - Anfänger-Themen 2
P Methoden Primzahltest mit Rekursion Java Basics - Anfänger-Themen 3
C Rekursion überführen in eine normale methode Java Basics - Anfänger-Themen 1
M Methoden Rekursion nachvollziehen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben