MINT lernen

Übung AFB I

Zehn Grundaufgaben zum ganzen Kapitel — von Abbruchbedingung und Aufrufstapel über Zeichenketten bis zu Mergesort, Quicksort und dem Wachstum n · log₂ n.

Dein Fortschritt:
0 / 0 Aufgaben
1

Aufgabenblock — AFB I

Zehn Standardaufgaben zum Reproduzieren: rekursive Methoden auswerten, Aufrufe zählen, Aufrufbäume zeichnen, Mischen und Zerlegen von Hand ausführen. Das sind die sicheren Punkte in jeder Klausur zu Rekursion.

A1
Rekursion auswerten
AFB I

Die Methode aus dem Unterricht berechnet die Anzahl der Dosen einer Pyramide mit n Reihen:

static int dosen(int n) {
    if (n == 0) {
        return 0;
    }
    return n + dosen(n - 1);
}

Geben Sie den Wert von dosen(5) und die Anzahl aller Aufrufe von dosen an.

Abbruchbedingung und Rekursionsschritt: Jeder Aufruf mit n > 0 wartet auf dosen(n − 1); erst dosen(0) liefert ohne Selbstaufruf 0.
Lösung anzeigen
5 + 4 + 3 + 2 + 1 + 0 = 15; Aufrufe mit n = 5, 4, 3, 2, 1, 0 → 15 und 6 Aufrufe
A2
Der Aufrufstapel
AFB I
static long fakultaet(int n) {
    if (n <= 1) {
        return 1;
    }
    return n * fakultaet(n - 1);
}

Nennen Sie den Rückgabewert von fakultaet(5) und die Rekursionstiefe, also die größte Zahl gleichzeitig offener Aufrufe.

Rekursionstiefe: Beim Abstieg kommt für jeden Aufruf ein Rahmen auf den Stapel; der letzte ist fakultaet(1).
Lösung anzeigen
Abstieg f(5) → f(4) → f(3) → f(2) → f(1); Aufstieg 1 → 2 → 6 → 24 → 120 → 120, Tiefe 5
A3
Der Aufrufbaum von fib
AFB I
static int fib(int n) {
    if (n <= 1) {
        return n;
    }
    return fib(n - 1) + fib(n - 2);
}

Stellen Sie den Aufrufbaum von fib(5) dar und geben Sie den Rückgabewert sowie die Anzahl der Knoten (Aufrufe) an.

Aufrufe zählen: \(A(n) = 1 + A(n-1) + A(n-2)\) mit \(A(0) = A(1) = 1\).
Lösung anzeigen
A(2) = 3, A(3) = 5, A(4) = 9, A(5) = 1 + 9 + 5 = 15; fib: 0, 1, 1, 2, 3, 5 → fib(5) = 5 mit 15 Aufrufen
A4
Quersumme
AFB I
static int quersumme(int n) {
    if (n < 10) {
        return n;
    }
    return n % 10 + quersumme(n / 10);
}

Bestimmen Sie quersumme(90817) und die Anzahl der Aufrufe.

Zerlegen: n % 10 ist die letzte Ziffer, n / 10 streicht sie (ganzzahlige Division).
Lösung anzeigen
7 + qs(9081) = 7 + 1 + qs(908) = … = 7 + 1 + 8 + 0 + 9; je Ziffer ein Aufruf → 25 und 5 Aufrufe
A5
Zeichen zählen
AFB I
static int zaehle(String s, char c) {
    if (s.length() == 0) {
        return 0;
    }
    int rest = zaehle(s.substring(1), c);
    if (s.charAt(0) == c) {
        return 1 + rest;
    }
    return rest;
}

Wenden Sie die Methode auf zaehle("Banane", 'a') an. Geben Sie das Ergebnis und die Anzahl der Aufrufe an.

Zeichenketten: s.substring(1) ist s ohne das erste Zeichen; die Rekursion endet beim leeren String.
Lösung anzeigen
Banane → anane → nane → ane → ne → e → "" (7 Aufrufe); „a“ steht an zwei Stellen, das große „B“ zählt nicht → 2 und 7 Aufrufe
A6
Binäre Suche rekursiv
AFB I

Die rekursive binäre Suche aus dem Unterricht wird auf die sortierte Reihung

static int binSuche(int[] a, int x, int links, int rechts) {
    if (links > rechts) {
        return -1;
    }
    int mitte = (links + rechts) / 2;
    if (a[mitte] == x) {
        return mitte;
    }
    if (a[mitte] < x) {
        return binSuche(a, x, mitte + 1, rechts);
    }
    return binSuche(a, x, links, mitte - 1);
}

mit dem Startaufruf binSuche(a, x, 0, 14) angewendet. Ermitteln Sie die Anzahl der Aufrufe für x = 58 und für x = 12.

Suchbereich: In jedem Aufruf wird a[mitte] angesehen; bei links > rechts endet die Suche ohne Treffer — auch das ist ein Aufruf.
Lösung anzeigen
58: mitte 7 (36), mitte 11 (58). 12: mitte 7, 3, 1, 2, dann Bereich 3…2 leer → 2 und 5 Aufrufe
A7
Maximum nach Teile und herrsche
AFB I

Das rekursive Maximum maximum(a, links, rechts) aus 3.3.1 teilt jeden Bereich bei mitte in zwei Hälften. Berechnen Sie für eine Reihung mit 12 Elementen die Anzahl aller Aufrufe und die Anzahl der Vergleiche.

Zählen: \(n\) Basisfälle, \(n - 1\) Zusammenführungen mit je einem Vergleich.
Lösung anzeigen
12 Basisfälle + 11 teilende Aufrufe = 23 = 2n − 1; 11 Vergleiche → 23 Aufrufe, 11 Vergleiche
A8
Zwei Hälften mischen
AFB I

Beim Mergesort werden die sortierten Hälften 5, 14, 20 und 9, 11, 30 gemischt. Erstellen Sie die gemischte Folge und geben Sie die Anzahl der Vergleiche an.

Mischen: immer die kleinere der beiden vorderen Zahlen übernehmen; ist eine Hälfte leer, kommt der Rest ohne Vergleich.
Lösung anzeigen
5|9 → 5, 14|9 → 9, 14|11 → 11, 14|30 → 14, 20|30 → 20, Rest 30 → 5 Vergleiche
A9
Zerlegen am Pivot
AFB I

Quicksort zerlegt {17, 42, 8, 31, 25} mit zerlege(a, 0, 4); das Pivot ist das letzte Element. Untersuchen Sie den Ablauf: Welchen Rückgabewert liefert zerlege, und welches Element steht danach an Index 4?

Zerlegen: Werte ≤ Pivot werden an die Stelle grenze getauscht; zum Schluss kommt das Pivot an die Stelle grenze.
Lösung anzeigen
Pivot 25: 17 ≤ 25 (grenze 1), 42 nein, 8 ≤ 25 (grenze 2), 31 nein; Tausch a[2] ↔ a[4]: 17, 8, 25, 31, 42 → 2 und 42
A10
Wachstum berechnen
AFB I

Vergleichen Sie für \(n = 512\) die Werte \(n\cdot\log_2 n\) (Mergesort) und \(\frac{n(n-1)}{2}\) (Selectionsort), indem Sie beide berechnen.

Logarithmus: \(\log_2 512 = 9\), denn \(2^9 = 512\).
Lösung anzeigen
512 · 9 = 4608; 512 · 511 : 2 = 130 816 — rund 28-mal so viel → 4608 und 130 816