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.
Analogie:
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.
Definition:
Rekursion ist eine Technik, bei der eine Funktion sich selbst aufruft, um ein Problem zu lösen, indem sie es auf eine kleinere Instanz desselben Problems reduziert. Jede rekursive Funktion hat genau zwei Teile: (1) Den rekursiven Fall — die Funktion ruft sich selbst mit kleinerem Input auf. (2) Den Basisfall — die Funktion gibt direkt einen Wert zurück, ohne sich erneut aufzurufen. Jeder Aufruf erzeugt einen neuen Stapelrahmen (Stack Frame) auf dem Aufrufstapel — ein Speicherplatz für Parameter und lokale Variablen.
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.
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.
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
Rekursion = eine Funktion ruft sich selbst auf, um ein Problem auf eine kleinere Version desselben Problems zu reduzieren.
Jede rekursive Funktion braucht zwei Teile: den Basisfall (wann aufhören) und den rekursiven Fall (wie weiter).
Ohne Basisfall: unendliche Aufrufe → Stapelüberlauf → RecursionError. Der Basisfall ist das Sicherheitsnetz.
Rekursion ist ideal für hierarchische Probleme (Ordner, Bäume, verschachtelte Strukturen), bei denen die Tiefe unbekannt ist.
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?
1. Welche zwei Teile braucht jede rekursive Funktion?
☐ A) Eine Schleife und einen Zähler
☐ B) Einen Basisfall und einen rekursiven Fall
☐ C) Einen Eingang und einen Ausgang
☐ D) Eine Variable und eine Konstante
2. factorial(4) wird aufgerufen. Wie viele Stapelrahmen existieren maximal gleichzeitig?
☐ A) 1
☐ B) 3
☐ C) 4
☐ D) 8
3. Eine countdown-Funktion hat keinen Basisfall. Was passiert bei countdown(3)?
☐ A) Sie zählt bis 0 und stoppt
☐ B) Sie zählt endlos weiter, bis Python nach ~1000 Aufrufen einen RecursionError auslöst
☐ C) Sie gibt 3 einmal aus und stoppt
☐ D) Sie macht nichts
4. Du musst alle .txt-Dateien in einem Ordner mit Unterordnern unbekannter Tiefe finden. Warum ist Rekursion hier besser als eine einfache for-Schleife?
☐ A) Rekursion ist immer schneller als Schleifen
☐ B) Eine einfache Schleife sieht nur eine Ebene, Rekursion kann in Unterordner unbekannter Tiefe absteigen
☐ C) Schleifen können keine Dateien lesen
☐ D) Rekursion braucht weniger Speicher
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.