Rekursion

Rekursion: die Programmiertechnik, die einfach aussieht, bis man sie versteht. Und dann auch.

Grundlagen 14 min Einsteiger 3. Mai 2026

Was wäre, wenn eine Funktion ein Problem lösen könnte, indem sie eine etwas einfachere Version von sich selbst um Hilfe bittet — immer wieder, bis die Antwort offensichtlich ist? Das ist Rekursion.

Die Entwickler-Plattform "Stack Overflow" wurde nach genau dem Absturz benannt, der passiert, wenn eine Rekursion kein Ende findet. Das allein zeigt, wie wichtig — und wie häufig — dieses Konzept in der Informatik ist.

Die sich selbst aufrufende Funktion

Rekursion

AnalogieDefinition
Rekursion funktioniert wie Matroschka-Puppen: Du öffnest die größte Puppe und findest eine kleinere mit einem Zettel: "Mach dasselbe mit mir." Das geht weiter, bis jemand die kleinste Puppe öffnet und eine Zahl findet — den Basisfall. Dann reist die Zahl zurück nach oben: Jede Person nimmt das Ergebnis, fügt ihren eigenen Beitrag hinzu und gibt es weiter.

Die Matroschka-Analogie bricht, weil in der realen Welt niemand den Kontext der vorherigen Puppe "erinnert". In einem Programm speichert jeder Stapelrahmen explizit seinen eigenen Zustand (Parameter, lokale Variablen) und wartet aktiv auf das Ergebnis des darunterliegenden Aufrufs.

Beispiel: Fakultät (5!) — Abstieg und Rückkehr

1
factorial(5) ruft factorial(4) auf — merkt sich 5 * ?
2
factorial(4) ruft factorial(3) auf — merkt sich 4 * ?
3
factorial(3) ruft factorial(2) auf — merkt sich 3 * ?
4
factorial(2) ruft factorial(1) auf — merkt sich 2 * ?
5
factorial(1) erreicht BASISFALL → gibt 1 zurück
6
factorial(2) = 2 * 1 = 2
7
factorial(3) = 3 * 2 = 6
8
factorial(4) = 4 * 6 = 24
9
factorial(5) = 5 * 24 = 120

Am tiefsten Punkt existieren 5 Stapelrahmen gleichzeitig im Speicher, jeder mit seiner eigenen Kopie von n. Wenn der Basisfall zurückkehrt, werden die Rahmen einer nach dem anderen in umgekehrter Reihenfolge abgebaut — das sogenannte "Abwickeln" (Unwinding).

Python-Code: Fakultät

def factorial(n):
    if n <= 1:              # Basisfall
        return 1
    return n * factorial(n - 1)  # Rekursiver Fall

print(factorial(5))  # Ausgabe: 120

Der Basisfall: Dein Sicherheitsnetz

Der Basisfall ist die wichtigste Zeile in jeder rekursiven Funktion. Er definiert, WANN die Funktion aufhört sich selbst aufzurufen und WAS sie an diesem Punkt zurückgibt. Ohne Basisfall ruft sich die Funktion unendlich oft auf — jeder Aufruf erzeugt einen neuen Stapelrahmen, bis der verfügbare Speicher erschöpft ist.

Stell dir ein kreisförmiges Labyrinth ohne Ausgangsschilder vor. Ohne Markierung wandert man endlos im Kreis. Setzt man eine rote Markierung an eine bestimmte Stelle mit der Anweisung "Wenn du die rote Markierung siehst, bleib stehen" — dann wird aus endlosem Wandern eine endliche Suche. Diese Markierung ist der Basisfall.

Countdown: Ohne vs. mit Basisfall

# KAPUTT — kein Basisfall
def countdown(n):
    print(n)
    countdown(n - 1)  # ruft endlos: 3, 2, 1, 0, -1, ...
# → RecursionError nach ~1000 Aufrufen

# KORREKT — Basisfall stoppt bei 0
def countdown(n):
    if n <= 0:           # Basisfall
        print(0)
        return           # STOPP
    print(n)
    countdown(n - 1)     # Rekursiver Fall

Der Unterschied ist eine einzige if-Abfrage — aber sie entscheidet zwischen einem funktionierenden Programm und einem Absturz. Der Basisfall muss VOR dem rekursiven Aufruf im Funktionskörper stehen.

Häufiger Fehler: Rekursionslimit erhöhen

sys.setrecursionlimit(10000) fügt keinen zusätzlichen Speicher hinzu — es verzögert nur den Absturz. Wenn das Problem echte unbegrenzte Tiefe erfordert, ist die richtige Lösung entweder ein korrekter Basisfall oder der Umstieg auf eine iterative Lösung.

Wo Schleifen versagen: Rekursion für Hierarchien

Schleifen (for, while) eignen sich hervorragend für lineare Folgen: durch eine Liste iterieren, von 1 bis n zählen. Aber wenn die Datenstruktur selbst verschachtelt ist — Ordner in Ordnern, HTML-Elemente in Elementen, Äste eines Spielbaums — kann eine einfache Schleife nicht tiefer als eine Ebene sehen.

Du musst alle .pdf-Dateien auf einer Festplatte finden. Den Ordner auf oberster Ebene durchgehen und jede Datei prüfen ist einfach. Aber manche Einträge sind Ordner, die weitere Dateien und Ordner enthalten, verschachtelt bis in unbekannte Tiefe. Der rekursive Ansatz: "Öffne den Ordner. Prüfe jeden Eintrag. Ist es eine Datei? Bewerte sie. Ist es ein Ordner? Wende dasselbe Verfahren an."

Rekursiv (impliziter Stack)

def find_pdfs(folder): results = [] for item in os.listdir(folder): path = os.path.join(folder, item) if os.path.isfile(path) and path.endswith('.pdf'): results.append(path) elif os.path.isdir(path): results.extend(find_pdfs(path)) return results Kürzer, liest sich wie die Problembeschreibung. Nutzt den Aufrufstapel implizit.

Iterativ (expliziter Stack)

def find_pdfs_iterative(root): results = [] stack = [root] while stack: folder = stack.pop() for item in os.listdir(folder): path = os.path.join(folder, item) if os.path.isfile(path) and path.endswith('.pdf'): results.append(path) elif os.path.isdir(path): stack.append(path) return results Umgeht Pythons Rekursionslimit bei sehr tiefen Verzeichnissen.

Rekursion in der Praxis

Dateisuche Ordnerstrukturen unbekannter Tiefe durchsuchen
HTML-Parsing Verschachtelte DOM-Elemente traversieren
JSON-Traversierung Verschachtelte Objekte und Arrays verarbeiten
Spielbäume MinMax-Algorithmus für Schach, Tic-Tac-Toe
Fraktale Sierpinski-Dreieck, Koch-Schneeflocke
Divide & Conquer Merge Sort, Quicksort, binäre Suche

Interaktiv: Fibonacci-Aufrufbaum

Klicke dich Schritt für Schritt durch den Aufrufbaum von fib(5). Beobachte, wie sich die Funktion immer wieder selbst aufruft, bis sie einen Basisfall erreicht — und wie die Ergebnisse dann den Baum hinauf zurückkehren. Achte besonders darauf, wie oft fib(2) und fib(3) mehrfach berechnet werden.

5 fib(5)
Schritt 1 / 13fib(5)

Synthese: Rekursion ist kein Zauber

Rekursion ist kein Zauber — sie ist ein diszipliniertes Delegationsmuster: Zerlege das Problem, vertraue darauf, dass dein zukünftiges Ich das kleinere Stück bewältigt, und definiere den Punkt, an dem die Delegation aufhört.

In der KI ist Rekursion allgegenwärtig: Baumtraversierungen, Tiefensuche (DFS), Divide-and-Conquer-Algorithmen und Spielbaum-Bewertung (MinMax) — alles basiert auf dem rekursiven Prinzip.

Das Wichtigste auf einen Blick

  1. Rekursion = eine Funktion ruft sich selbst auf, um ein Problem auf eine kleinere Version desselben Problems zu reduzieren.
  2. Jede rekursive Funktion braucht zwei Teile: den Basisfall (wann aufhören) und den rekursiven Fall (wie weiter).
  3. Ohne Basisfall: unendliche Aufrufe → Stapelüberlauf → RecursionError. Der Basisfall ist das Sicherheitsnetz.
  4. Rekursion ist ideal für hierarchische Probleme (Ordner, Bäume, verschachtelte Strukturen), bei denen die Tiefe unbekannt ist.
  5. Rekursion und Iteration sind gleichwertig, aber Rekursion bildet hierarchische Probleme natürlicher ab.

Quiz: Rekursion

Frage 1 / 4
Noch offen

Welche zwei Teile braucht jede rekursive Funktion?

Wählen Sie eine Antwort
Auflösung: 1) B · 2) C · 3) B · 4) B

Checkpoint: Teste dein Wissen

  • Erkläre, was im Speicher passiert, wenn factorial(4) aufgerufen wird. Wie viele Stapelrahmen existieren maximal gleichzeitig?
  • Warum stürzt countdown(3) ohne Basisfall ab? Was genau passiert nach ~1000 Aufrufen?
  • Finde alle .txt-Dateien in einem Ordner mit Unterordnern — beschreibe den rekursiven Ansatz in eigenen Worten.