Rekursiver Aufruf

HaliGali9761

Mitglied
Hallo alle zusammen, ich habe folgende Rekursion:

Code:
public class RekursiverAufruf {

    public static String exB(int n) {
        if (n <= 0)
            return "";
        return exB(n - 2) + (n + 1) + exB(n - 1);

    }

    public static void main(String[] args) {

        System.out.print(exB(4));
    }
}
ich soll die Ausgabe mit dem Aufruf 4 erklären und meine Übungsergebnisse stimmen leider nicht mit dem richtigem Ergebnis(3252432) überein. Daher wollte ich fragen ob mir jemand eine Hilfestellung geben könnte wie ich diesen Aufruf richtig abarbeite.
Ich komme einfach nicht auf die Idee wie ich richtig an diese Aufgabe herangehe, hab mich konzentriert hingesetzt und bin leider nicht auf den richtigen Lösungsweg gestoßen.

Wäre sehr dankbar für kleine Unterstützungen.
 
exB(4)
= exB(2) + 5 + exB(3)
Das wäre der erste Ersetzungsschritt und hier ist eine Stolperfalle. 5 ist zwar int, aber der return-Wert von exB ist nicht int, sondern String. Damit werden die einzelnen Ergebnisse zusammengefügt und nicht mehr addiert. Weitere Ersetzungen:
= exB(0) + 3 + exp(1) + 5 + exB(1) + 4 + exB(2)
= "" + 3 + exB(-1) + 2 + exB(0) + 5 + exB(-1) + 2 + exB(0) + 4 + exB(0) + 3 + exB(1)
= "3" + "" + 2 + "" + 5 + "" + 2 + "" + 4 + "" + 3 + exB(-1) + 2 + exB(0)
= "325243" + "" + 2 + ""
= "3252432" (String, nicht int)
 
= exB(0) + 3 + exp(1) + 5 + exB(1) + 4 + exB(2)

Fangen wir bei dieser Zeile an: exB(0, weil 2-2?) +(3, weil 2+1?)+exB(1,weil 2-1?). Ist das richtig so? Wieso folgt denn nach der exB(1) eine 5 ? Nach der 5 folgen ja exB(1, weil 3-2?)+(4, weil 3+1?)+exB(2, weil 3-1?)
.
Nach welcher Reihenfolge werden die Zahlen denn ersetzt ?
Könntest du mir bitte erklären erklären wie genau diese 1. Ersetzung zu Stande kommt?
 
So geht es los:
exB(4)
= exB(2) + 5 + exB(3)
Das exB(2) wird dann durch
exB(0) + 3 + exp(1)
ersetzt (die Begründung dafür hast du richtig erkannt). Die "5" stammt also noch vom ersten Aufruf.

Ersetzen ist hier wörtlich zu nehmen. Du ersetzt jeden exB(x) Aufruf durch die daraus resultierenden Aufrufe und die "5" bleibt einfach so stehen wie sie ist.

Edits: Ein paar Erklärungen ergänzt.
 
Zuletzt bearbeitet:
Bei exB(4) kommt return exB(n - 2) + (n + 1) + exB(n - 1), das ist exB(2) + 5 + exB(3).
Dabei wird im Programm exB(2) erst vollständig durchlaufen. Was wiederum exB(0) + 3 + exB(1) ist. Du kannst dir exB(2) gedanklich daher mit diesem Term ersetzen. Die 5 verbleibt durch die erste Ersetzung, die Reihenfolge bleibt gleich. Lass mich obiges noch einmal mit Formattierung aufführen.

exB(4)
= exB(2) + 5 + exB(3)
=
exB(0) + 3 + exp(1) + 5 + exB(1) + 4 + exB(2)
= "" + 3 + exB(-1) + 2 + exB(0) + 5 + exB(-1) + 2 + exB(0) + 4 + exB(0) + 3 + exB(1)
= "3" + "" + 2 + "" + 5 + "" + 2 + "" + 4 + "" + 3 + exB(-1) + 2 + exB(0)
= "325243" + "" + 2 + ""
= "3252432"
 
Danke für die Bemühungen aber ich verstehe echt nicht die Struktur dieser Abarbeitungen. Ich weiß nicht wann ich erkenne wenn ein exB() komplett durchlaufen ist.
exB(2) + 5 + exB(3)
Dieser Teil ist mir völlig klar.

exB(0) + 3 + exp(1) + 5 + exB(1) + 4 + exB(2)
exB (2-2= 0) + 5-2=3 +exB (2-1=1) +5 (von oben)+ exB(3-2= 1)+ 3+1=4 +exB (3-1=2) .
So erkläre ich mir diese Zeile

"" + 3 + exB(-1) + 2 + exB(0) + 5 + exB(-1) + 2 + exB(0) + 4 + exB(0) + 3 + exB(1)
Fange ich in dieser Zeile an mit der 1 zu ersetzen?
Das "" und +3+ stammt aus dem letzten Aufruf? Danach fange ich an mit der 1 zu ersetzen?
exB(1-2=-1)+ 1+1=2 +exB(1-1=0)+5+ ......
Wieso wird nach der 5 wieder mit 1 ersetzt? Ich verstehe nicht nach welchen Regeln hier dauerhaft ersetzt wird, in der Zeile davor wurde ja meines Erachtens nach logisch mit exB(2) und dann mit exB(3) ersetzt, hier verstehe ich die Struktur einfach nicht mehr 😱
 
Vielleicht musst du es nur noch ausführlicher aufschreiben und nicht so viele Aufrufe gleichzeitig auflösen:
Code:
  exB(4)
= exB(2)                   + 5 + exB(3)
= exB(0) + 3 + exB(1)      + 5 + exB(3)
= ""     + 3 + exB(1)      + 5 + exB(3)
= 3 + exB(1)               + 5 + exB(3)
= 3 + exB(-1) + 2 + exB(0) + 5 + exB(3)
= 3 + ""      + 2 + ""     + 5 + exB(3)
= 32                       + 5 + exB(3)
= 325 + exB(3)
= 325 + exB(1)               + 4 + exB(2)
= 325 + exB(-1) + 2 + exB(0) + 4 + exB(2)
= 325 + ""      + 2 + ""     + 4 + exB(2)
= 32524 + exB(2)
= 32524 + exB(0) + 3 + exB(1)
= 32524 + ""     + 3 + exB(-1) + 2 + exB(0)
= 32524          + 3 + ""      + 2 + ""
= 3252432
 

Zurück
Oben