studyklar
GdI 2 · Probeklausur Teil 1 · Aufgabe 4

Rekursion mehrfachMult(2, 3): die Aufruftabelle ausfüllen

Eine Methode, die sich selbst aufruft: Das wirkt zuerst wie ein Kreis ohne Ende. Mit einer Tabelle verfolgen wir jeden Aufruf, erst hinunter bis b bei 0 ist, dann zurück. Rechts stehen die Methode und die fertige Tabelle. Mit Weiter geht es Schritt für Schritt voran.

Die Aufgabe

Aufgabe 4

Gegeben ist die folgende, rekursive Methode „mehrfachMult“:

    public static int mehrfachMult(int a, int b) {        int ergebnis = 1;        if (b > 0) {            ergebnis = a * mehrfachMult(a, b - 1);        }        return ergebnis;    }

Es soll ermittelt werden, was die Methode tut, wenn Sie mit folgenden Argumenten aufgerufen wird: mehrfachMult(2, 3);

Geben Sie hierzu in folgender Tabelle für jeden Aufruf von „mehrfachMult“ an, welche Parameterwerte übergeben werden, welche Werte die Variablen innerhalb der Methode zugewiesen bekommen, was die Methode zurückgibt, und mit welchem Argument die Methode ggf. erneut aufgerufen wird.

Eventuell können Sie manche Werte erst eintragen, wenn Sie Einträge in den weiteren Zeilen vorgenommen haben. Es werden nicht alle Zeilen der Tabelle benötigt.

AufrufabergebnisGgf. Parameter für weiteren Aufruf von „mehrfachMult“Rückgabe
mehrfachMult(2, 3)

Was ist das Gesamtergebnis?

Der Code ist gegeben, nichts ist zu programmieren. Gesucht ist, was beim Aufruf mehrfachMult(2, 3) passiert. Für jeden Aufruf kommt eine Zeile in die Tabelle: welche Werte a und b haben, welchen Wert ergebnis bekommt, mit welchen Werten die Methode sich erneut aufruft und was sie zurückgibt.

Eine Methode, die sich selbst aufruft, heißt rekursiv. Jeder Aufruf hat seine eigenen Variablen a, b und ergebnis. Darum bekommt jeder Aufruf seine eigene Zeile.

Merke: Ein rekursiver Aufruf wartet, bis der Aufruf, den er gestartet hat, fertig ist. Erst dann rechnet er weiter. Die Rückgaben füllt man darum von unten nach oben aus.
  1. Die Methode Zeile für Zeile lesen.
  2. Hinweg: vier Aufrufe, bis b gleich 0 ist.
  3. Rückweg: von unten nach oben multiplizieren und zurückgeben.
  4. Gesamtergebnis ablesen und deuten.

Die Methode Zeile für Zeile

    public static int mehrfachMult(int a, int b) {        int ergebnis = 1;        if (b > 0) {            ergebnis = a * mehrfachMult(a, b - 1);        }        return ergebnis;    }

Zeile 8 setzt ergebnis auf 1. Ist b größer als 0, ruft Zeile 10 dieselbe Methode noch einmal auf, mit demselben a und einem um 1 kleineren b. Deren Rückgabe wird mit a multipliziert und in ergebnis gespeichert. Zeile 12 gibt ergebnis zurück.

Ist b gleich 0, wird Zeile 10 übersprungen. Dann gibt die Methode sofort 1 zurück und ruft sich nicht mehr auf. Diese Stelle heißt Abbruchbedingung: Ohne sie riefe sich die Methode endlos selbst auf.

Aus Vorlesung 4, Folie 14 („Rekursion“): Methoden können andere Methoden aufrufen, auch sich selbst. Das heißt Rekursion.
Aus Vorlesung 4, Folie 4 („Methoden mit Rückgabe von Werten“): return gibt einen Wert an die Stelle zurück, von der aus die Methode aufgerufen wurde.

Erster Aufruf: mehrfachMult(2, 3)

AufrufabergebnisParameter für weiteren AufrufRückgabe
mehrfachMult(2, 3)2312, 2?

Der Aufruf übergibt 2 und 3. Also ist a = 2 und b = 3. Zeile 8 setzt ergebnis auf 1.

3 > 0 ist wahr, also kommt Zeile 10: 2 * mehrfachMult(2, 3 - 1). Bevor Java multiplizieren kann, braucht es den Wert von mehrfachMult(2, 2). Dieser Aufruf startet jetzt; der erste wartet. Seine Rückgabe kennen wir noch nicht, darum steht dort ein Fragezeichen.

Noch 8 Schritte bis zum Ergebnis
Den ganzen Lösungsweg sehen Studierende und Lehrende der HS KL. Registriere dich mit deiner Adresse @stud.hs-kl.de oder @hs-kl.de, dann geht es hier direkt weiter.

Die Methode mehrfachMult

und die ausgefüllte Tabelle

Abbildung 1Die Methode mehrfachMult

und die ausgefüllte Tabelle

public class Rekursion {     public static void main(String[] args) {        System.out.println(mehrfachMult(2, 3));    }     public static int mehrfachMult(int a, int b) {        int ergebnis = 1;        if (b > 0) {            ergebnis = a * mehrfachMult(a, b - 1);        }        return ergebnis;    }}
AufrufabergebnisParameter für weiteren AufrufRückgabe
mehrfachMult(2, 3)231, dann 2 · 4 = 82, 28
mehrfachMult(2, 2)221, dann 2 · 2 = 42, 14
mehrfachMult(2, 1)211, dann 2 · 1 = 22, 02
mehrfachMult(2, 0)201–1
LegendeDie Methode und die fertige Aufruftabelle.