Wie übergebe ich den Zähler für die Anzahl Rekursionsschritte korrekt?

Hallo miteinander

Ich habe eine kleine Rekursions-Methode, die per return ausgeben soll, wie oft sie ausgeführt wird.
Der Zähler läuft wie erwartet (kontrolliert mit Syso des Zählers bei jeder Ausführung). Aber der return-Wert ist immer 1 (anstatt n=Anzahl Ausführungen).

Meine Ausgabe ist:
gelesen: 1
...
gelesen: 1000

Juhu, ich habe 1 von 1000 gelesen!

Meine Überlegung:
  1. Methode startet, if-Bedingung wird geprüft. Z10
  2. if-Body wird ausgeführt -> Rekursion mit den "neuen" Parametern. Auch der Zähler (=pagesRead) wird übergeben. Z11-Z13
  3. 999 weitere Rekursionsschritte. Z9-14
  4. Methode startet zum 1000. Mal. Zähler/pagesRead=1000. if-Bedingung wird geprüft, ist diesmal aber false. Z10
  5. Rest der Methode wird ausgelesen -> return Zähler/pagesRead. Z15

Darum glaube ich, dass 1000 statt 1 ausgeben werden sollte.

Wo ist mein Denkfehler?

Vielen Dank im Voraus,
Markus

Java:
public class kapitel70a3 {
    public static void main(String[] args) {
        int numberOfPages=1000;
        int pagesRead=0;

        System.out.println("Juhu, ich habe "+read(numberOfPages, pagesRead)+" von "+numberOfPages+" gelesen!");
    }

    public static int read (int numberOfPages, int pagesRead){
        if (pagesRead<numberOfPages){
            pagesRead++;
            System.out.println("gelesen: "+pagesRead);
            read(numberOfPages, pagesRead);
        }
        return pagesRead;
    }
}

/*
Describe with recursion how to read a 1000 page book.
*/
 
Beste Antwort
Der Denkfehler ist, dass deine Methode direkt beim ersten Aufruf als return den Parameter `pagesRead` des ersten Aufrufes zurückliefert. Das liegt daran, dass du read() zwar weiter rekursiv aufrufst, dich aber nicht für dessen Rückgabewert interessierst.
Und: Lokale Variablen (und dazu zählen auch Methodenparameter) sind nicht global für alle Aufrufe der Methode, sondern immer lokal pro Methodenaufruf. Dein pagesRead++ erhöht also nur den Parameter des ersten Aufrufes um 1 und nicht um die Anzahl der rekursiven Aufrufe.
Wenn du das beheben willst, dann solltest du das Ergebnis vom rekursiven Aufruf von read() nicht einfach wegschmeissen, sondern zurückgeben.
Im einfachsten Fall schreibe also vor das `read(numberOfPages, pagesRead);`...
Der Denkfehler ist, dass deine Methode direkt beim ersten Aufruf als return den Parameter `pagesRead` des ersten Aufrufes zurückliefert. Das liegt daran, dass du read() zwar weiter rekursiv aufrufst, dich aber nicht für dessen Rückgabewert interessierst.
Und: Lokale Variablen (und dazu zählen auch Methodenparameter) sind nicht global für alle Aufrufe der Methode, sondern immer lokal pro Methodenaufruf. Dein pagesRead++ erhöht also nur den Parameter des ersten Aufrufes um 1 und nicht um die Anzahl der rekursiven Aufrufe.
Wenn du das beheben willst, dann solltest du das Ergebnis vom rekursiven Aufruf von read() nicht einfach wegschmeissen, sondern zurückgeben.
Im einfachsten Fall schreibe also vor das `read(numberOfPages, pagesRead);` noch ein `return`.
 
Beste Antwort

Zurück
Oben