Rekursion mit if-Anweisung

ndwho

Mitglied
Hallo ihr Lieben,

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!

LG
 
Was da ausgegeben wird, hängt vom Parameter n ab. Da es zwei rekursive Aufrufe gibt, bedeutet das für die Laufzeit (2^n) nix Gutes.

strange(5)
5 3 3 5

strange(6)
6 4 4 3 3 6

leider kein Palindrom.
 
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?
 
Zuletzt bearbeitet:
Irgendeiner hat doch mal gesagt (oder Signatur), was bei einer Rekursion passiert, versteht man, wenn man versteht, was bei einer Rekursion passiert...
 
Code:
//strange mit Parameter = 5
if (n <=2) return ;                   //if ist false
System . out. print (n+" ");  // Aufgabe: 5
strange (n -2);                       //strange wird mit 3 aufgerufen
if (n <=2) return ;                   //if ist false
System . out. print (n+" ");  // Aufgabe: 3
strange (n -2);                        //strange wird mit 1 aufegerufen
...[hier fehlt noch was]...      
strange (n -3);
System . out. print (n+" "); }

Off-Topic:
Ja, so sehe ich das auch.
Zitat: Du hast Rekursion nicht verstanden, dann wiederhole es, bis du es verstanden hast.
 
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.
 

Zurück
Oben