Methoden Java ist auch eine Insel Listing 2.40 Recursion

Diskutiere Java ist auch eine Insel Listing 2.40 Recursion im Java Basics - Anfänger-Themen Bereich.
C

ChrisBT

Hallo zusammen,

ich habe angefangen Java zu lernen und bin auf ein Problemchen gestoßen, welches mich nun schon geraume Zeit beschäftigt.
Ich verstehe einfach nicht, warum die Methode down2 die Zahlen aufsteigend ausgibt.
Wie kommt es dazu?
Java:
static void down2( int n ){
    if ( n <= 0 )
        return;
    
    down2( n - 1 );
    System.out.print( n + ", ");
}
Aufgerufen wird die Methode aus der main-Methode mit down2(10);
Ich habe die Erklärung im Buch bestimmt schon 20 Mal gelesen. Ich verstehe einfach nicht, warum, nachdem n=0 ist, System.out.print eine 1 ausgibt und warum down2(int) im Anschluss mit 2 belegt ist.

Vielleicht kann mir das einer mal mit einfachen Worten erklären, wie der Ablauf und die Belegung der Variablen ist.

Viele Grüße
Chris
 
G

Gelöschtes Mitglied 62473

Man kann sich das mit einem Trick leichter visualisieren:
Java:
	static void down2(int n, int i) {
		if (n <= 0)
			return;
		System.out.printf("%" + i + "s%s%n", "", n);
		down2(n - 1, i + 1);
		System.out.printf("%" + i + "s%s%n", "", n);
	}

	public static void main(String[] args) {
		down2(5, 1);
	}
Code:
 5
  4
   3
    2
     1
     1
    2
   3
  4
 5
Wie man hier sieht wird n erst heruntergezählt und danach dann ausgegeben.
 
C

ChrisBT

Hallo Flown und Xyz1,
vielen Dank fuer die schnellen Antworten.
Wie die runterzaehlende Rekursion ablaeuft, zumindest die in dem Buch, habe ich verstanden, auch dass die andere (down2) hochzaehlt, habe ich gesehen.
Meine Frage war ja, warum macht sie das. Warum hat "n" bei Abbruch durch die if-Ueberpruefung (n<=0) den Wert 1 bei der Ausgabe durch System.out? Der sollte doch "0" sein.
Ist die "1" ausgegeben, wird down2 ploetzlich mit down2(2) aufgerufen. Warum ist das so?
Hier haenge ich fest und verbeisse mich darin und komme dadurch nicht weiter.

Sorry fuer dieses ue, oe usw.. Sitze gerade in den USA und habe nur eine englische Tastatur.
 
C

CSHW89

Ist die "1" ausgegeben, wird down2 ploetzlich mit down2(2) aufgerufen. Warum ist das so?
Nein down2(2) wird nicht nochmal aufgerufen, sondern der vorherige Aufruf wird fortgesetzt. Um es mal etwas klarer zu erklären:

Code:
main: Ruft down2(5) auf und wartet bis diese abgearbeitet ist
  down2(5): Ruft down2(4) auf und wartet bis diese abgearbeitet ist
    down2(4): Ruft down2(3) auf und wartet bis diese abgearbeitet ist
      down2(3): Ruft down2(2) auf und wartet bis diese abgearbeitet ist
        down2(2): Ruft down2(1) auf und wartet bis diese abgearbeitet ist
          down2(1): Ruft down2(0) auf und wartet bis diese abgearbeitet ist
            down2(0): Macht nichts
          down2(1): Wird nach Aufruf down2(0) fortgesetzt und gibt "1, " aus
        down2(2): Wird nach Aufruf down2(1) fortgesetzt und gibt "2, " aus
      down2(3): Wird nach Aufruf down2(2) fortgesetzt und gibt "3, " aus
    down2(4): Wird nach Aufruf down2(3) fortgesetzt und gibt "4, " aus
  down2(5): Wird nach Aufruf down2(4) fortgesetzt und gibt "5, " aus
 
C

ChrisBT

Danke fuer deine Erklaerung, CSHW89.
Ich versuche mal was, um zu erklaeren, was fuer mich so undurchsichtig ist.
Hier die Methode mit den Werten der Variablen, so wie ich das verstehe:
down2(3) aufrufen...
Code:
static void down2( 3 ){
    if ( 3 <= 0 )
        return;
    
    down2( 3 - 1 ); // Ruft down2(2) auf
    System.out.print( 3 + ", "); // Noch keine Ausgabe
}
Code:
static void down2( 2 ){
    if ( 2 <= 0 )
        return;
    
    down2( 2 - 1 );//Ruft down2(1) auf
    System.out.print( 2 + ", ");//Noch keine Ausgabe
}
Code:
static void down2( 1 ){
    if ( 1 <= 0 )
        return;
    
    down2( 1 - 1 );//Ruft down2(0) auf
    System.out.print( 1 + ", ");//Noch keine Ausgabe
}
Code:
static void down2( 0 ){
    if ( 0 <= 0 )
        return; // Springt zu System.out
    
    down2( 0 - 1 );//Ruft down2(-1) auf ???? Da hakt es bei mir!
    System.out.print( 0 + ", ");// Ist doch 0 oder nicht?
}
Es ist sicher ganz einfach, aber ich stehe echt im Moment auf dem Schlauch. :rolleyes:
 
C

CSHW89

Danke fuer deine Erklaerung, CSHW89.
Ich versuche mal was, um zu erklaeren, was fuer mich so undurchsichtig ist.
Hier die Methode mit den Werten der Variablen, so wie ich das verstehe:
down2(3) aufrufen...
Code:
static void down2( 3 ){
    if ( 3 <= 0 )   // (1)
        return;
  
    down2( 3 - 1 );   // (2)
    System.out.print( 3 + ", ");   // (11)
}
Code:
static void down2( 2 ){
    if ( 2 <= 0 )   // (3)
        return;
  
    down2( 2 - 1 );   // (4)
    System.out.print( 2 + ", ");   // (10)
}
Code:
static void down2( 1 ){
    if ( 1 <= 0 )   // (5)
        return;
  
    down2( 1 - 1 );   // (6)
    System.out.print( 1 + ", ");   // (9)
}
Code:
static void down2( 0 ){
    if ( 0 <= 0 )   // (7)
        return;   // (8)
  
    down2( 0 - 1 );   // Wegen (8) wird dies hier nicht mehr ausgeführt. "return" beendet diesen Aufruf.
    System.out.print( 0 + ", ");
}
Es ist sicher ganz einfach, aber ich stehe echt im Moment auf dem Schlauch. :rolleyes:
Vielleicht mal ein weiteren Versuch. Ich habe in deinem Kommentar die Ausführungsreihenfolge markiert.
 
C

ChrisBT

Oha, ich glaube jetzt habe ich es gerafft.
Da war ich ja auf dem voellig falschen Weg.
Vielen Dank CSHW89!
 
Thema: 

Java ist auch eine Insel Listing 2.40 Recursion

Passende Stellenanzeigen aus deiner Region:
Anzeige

Neue Themen

Anzeige

Anzeige
Oben