ich habe eine frage bezüglich des folgenden Codes:
Code:
public static void strange(int n){
if (n <=2) return ;
System . out. print (n+" ");
strange (n -2);
strange (n -3);
System . out. print (n+" "); }
Und zwar ist die Frage was die Textausgabe ist wenn strange(5). Ich habe das mal nachprogrammiert und als Ausgabe kamen: 5 3 3 5. Nun meine Frage: Wie kommt man auf diese Werte bzw. kann mir jemand die Zeilen 1, 3, 4 erklären was da passiert?
Komisch finde ich auch, dass wenn ich Zeile 4: strange(n-3); den Konstanten 3 ändere die Ausgabe gleich bleibt. Bei Zeile 3 ändert sich die Ausgabe jedoch, wenn ich die Kontante 2 ändere.
Wäre sehr dankbar!
Die if-Bedingung mit dem return sorgt für den Abbruch und die anderen beiden Zeilen, rufen die gleiche Funktion mit einem anderen Parameter auf. Die Methode strange ruft sich also selber nochmal auf. Dieses Prinzip nennt man Rekursion.
Schreib doch mal bitte auf, welche Codezeilen deiner Meinung nach aufgeführt werden, bis das Programm terminiert.
Die if-Bedingung mit dem return sorgt für den Abbruch und die anderen beiden Zeilen, rufen die gleiche Funktion mit einem anderen Parameter auf. Die Methode strange ruft sich also selber nochmal auf. Dieses Prinzip nennt man Rekursion.
Schreib doch mal bitte auf, welche Codezeilen deiner Meinung nach aufgeführt werden, bis das Programm terminiert.
Die if-Bedingung ist ja if(n <= 2), also bei strange(5) würde die if-Anweisung abbrechen, sobald die Rekursion den Parameter n <= 2 gesetzt hat. Also nach Zeile 3 und 4 wird der Parameter n ja um 2 und um 3 verringert.
Die ersten beiden Werte von der Ausgabe 5 3 kann ich nachvollziehen. Jedoch die Zeile 4: strange(n-3); verwirrt mich, da hier nie um 3 verringert wird. Bleibt nur noch die Frage wie kommt man auf die beiden letzten Werte 3 5?
Irgendeiner hat doch mal gesagt (oder Signatur), was bei einer Rekursion passiert, versteht man, wenn man versteht, was bei einer Rekursion passiert...
Wenn du die Funktionsaufrufe am Papier nachvollziehst, dann kommt folgendes dabei raus:
Code:
strange (5)
if (5 <=2) return ; // false, daher passiert nichts
System . out. print (5 +" "); // erste Ausgabe : 5
strange (5 - 2); //
if (3 <=2) return ; // false, daher passiert nichts
System . out. print (3 +" "); // zweite Ausgabe : 3
strange (3 - 2); //
if (1 <=2) return ; // true, damit kann der Rest des Aufrufs ignoriert werden
System . out. print (1 +" "); // --
strange (3 - 2); // --
strange (3 - 3); // --
System . out. print (1 +" "); // --
strange (3 - 3);
if (0 <=2) return ; // true, damit kann der Rest des Aufrufs ignoriert werden
System . out. print (0 +" "); // --
strange (0 - 2); // --
strange (0 - 3); // --
System . out. print (0 +" "); // --
System . out. print (3 +" "); // dritte Ausgabe : 3
strange (5 - 3);
if (2 <=2) return ; // true, damit kann der Rest des Aufrufs ignoriert werden
System . out. print (2 +" "); // --
strange (2 - 2); // --
strange (2 - 3); // --
System . out. print (2 +" "); // --
System . out. print (5 +" "); // vierte Ausgabe : 5
Jede Einrückung bedeutet dabei, einen Aufruf der Funktion - ich habe also die Befehle der Funktion an jeder Stelle, wo die Funktion aufgerufen wird, reinkopiert und die Parameter angepasst. Dort, wo die Funktion sofort verlassen wird, weil n<=2 ist, habe ich natürlich abgebrochen.
Ich hoffe, durch das Einrücken wird der Ablauf für dich klarer ersichtlich.