Rekursion einer Zahlenfolge (Ab- und Aufzählung)

Krön

Mitglied
Hallo, ich habe diesen Code hier:

Java:
public class MyClass {
    public static void main(String args[]) {
      
      c(3);
      
    }
    
    public static int c (int n){
        
        System.out.print(n);
        if (n > 0)
        {
           c (n-1);
           System.out.print(n);
        }
        return 0;
    }
}


Die Ausgabe ist jetzt 3210123. Die 3210 kommt ja daraus, dass n-1 abgezogen wird (rekursiv). Aber woher kommen die 123 am Ende? Nach return 0, sollte das Programm doch beendet werden?



Für Antworten währe ich sehr dankbar.
 
Beste Antwort
Aber woher kommen die 123 am Ende? Nach return 0, sollte das Programm doch beendet werden?
Die Ausgabe 3210 kommt von der Zeile 10.
In Zeile 13 wird die Funktion rekursiv aufgerufen solange bis n == 0.
Dann wird der Funktion Stack abgerufen und die Funktion kehrt 3 mal zurück.
Jetzt wird die Zeile 14 relevant und die Ausgabe von n erfolgt jetzt in verkehrter Reihenfolge 1 -> 2 -> 3
Was du möchtest ist wahrscheinlich so etwas.

Java:
public static void prtCountDown( int n ) {
        System.out.print(n);
        if( n == 0 )
            return;       
        prtCountDown(n-1);       
    }
Aber woher kommen die 123 am Ende? Nach return 0, sollte das Programm doch beendet werden?
Die Ausgabe 3210 kommt von der Zeile 10.
In Zeile 13 wird die Funktion rekursiv aufgerufen solange bis n == 0.
Dann wird der Funktion Stack abgerufen und die Funktion kehrt 3 mal zurück.
Jetzt wird die Zeile 14 relevant und die Ausgabe von n erfolgt jetzt in verkehrter Reihenfolge 1 -> 2 -> 3
Was du möchtest ist wahrscheinlich so etwas.

Java:
public static void prtCountDown( int n ) {
        System.out.print(n);
        if( n == 0 )
            return;       
        prtCountDown(n-1);       
    }
 
Beste Antwort
System.out.print(n);
Das rufst du zweimal auf. Deshalb solltest du dich aucH nicht wundern, wenn die Zahlen zweimal ausgegeben werden.
Vielleicht hilt es, das Problem zu verstehen, wenn du noch mehr Informationen ausgibst, etwa in der Art:
Java:
        System.out.print("vorher " + n);
        if (n > 0)
        {
           c (n-1);
           System.out.print("nachher " + n);
        }
 
Nach return 0, sollte das Programm doch beendet werden?
Zu dem Aspekt evtl. noch die wichtige Information: Mit return wird kein Programm beendet sondern lediglich die aktuelle Methode verlassen.

Nach dem Verlassen der Methode geht es mit dem nächsten Befehl weiter. Die Ausgabe ist ja auch ein Methodenaufruf:
In der Klasse System gibt es eine Instanzvariable out welche die Methode print bereit stellt. Diese wird aufgerufen. Wenn diese print Methode beendet ist (Also entweder zu einem return Anweisung oder ans Ende kommt), geht es nach dem Aufruf weiter. Also nach der ersten Ausgabe kommt es dann zu der if Anweisung.
 

Zurück
Oben