Vinzenz Mai: Fehler in Rekursion

Beitrag lesen

Hallo,

Falls Du meine Ausführungen verstanden hast, könnten wir an einen neuen Ansatz für Deine Funktion gehen. Falls Du meine Ausführungen nicht ganz verstanden hast oder nicht nachvollziehen kannst, erläutere bitte, wo Du Verständnisschwierigkeiten hast oder hängengeblieben bist, damit wir es Dir besser erklären können.

Ich hoffe mal, dass ich es richtig verstanden habe. Zunächst habe ich mal das $barray zu einem $this->barray gemacht.
Und unter der Funktion ein return $this->barray; eingefügt.

Wenn Du das Array als Eigenschaft anlegst, erübrigt sich prinzipiell gesehen die Rückgabe. Wie in meinem Beispiel demonstriert, darfst Du die Funktion nur dann zweimal aufrufen, wenn Du das Array vor dem zweiten Aufruf wieder mit Nullen füllst (sprich: neu initialisierst).

Trotzdem hängt sich die Rekursion weiterhin auf, was habe ich übersehen?!

eine ganze Menge:
Wie von mir bereits gezeigt, könnte Deine Funktion ohnehin nur dann ein sinnvolles Ergebnis liefern, wenn letter2 genau um 1 größer ist als letter.

Außerdem musst Du bedenken, dass für die Variablen letter, letter1, sig2 das Gleiche gilt. Wenn die Funktion aus einem rekursiven Aufruf, innerhalb dessen z.B. die Signatur gekürzt wurde, wieder zurückkehrt und weitermacht, dann hat sig2 wieder den gleichen Wert wie vor dem rekursiven Aufruf, ist also wieder länger.

Grundsätzlich halte ich hier iteratives Vorgehen für viel einfacher und intuitiver als die Rekursion. Geh' einfach Zeichen für Zeichen durch:

Lies abwechselnd die Buchstaben und ihre Anzahl ein.
Dabei gilt
    Folgt auf einen Buchstaben ein weiterer Buchstabe oder das Signaturende
        so ist die Anzahl dieses Buchstaben 1
    Sonst
        lies solange Zeichen ein, wie Ziffern aufeinander folgen
        Der in eine Integer umgewandelte Wert dieser Ziffernfolge ist
        die Anzahl
    Ende wenn

Freundliche Grüße

Vinzenz