0Pricing
DSA Interview Prep · Lektion

Rekursionsschema: Basisfall, Vertrauen, Aufbau

Wenden Sie die Drei-Schritte-Methode an, um korrekte rekursive Lösungen für Fakultät, Potenz und Ziffernsumme zu schreiben, ohne jeden Aufruf nachzuverfolgen.

Rekursionsschema: Basisfall, Vertrauen, Aufbau ist eine kostenlose DSA Interview Prep-Lektion auf CoddyKit. Dies ist Lektion 1 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des DSA Interview Prep-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der DSA Interview Prep-Kurs umfasst insgesamt 4 Lektionen.

Warum Rekursion schwierig wirkt

Die meisten Anfänger versuchen, jeden rekursiven Aufruf gedanklich nachzuverfolgen, was selbst bei einer Rekursionstiefe von fünf Ebenen schnell überwältigend wird. Die professionelle Vorgehensweise besteht darin, ein Drei-Schritte-Framework aus Basisfall, Vertrauen und Aufbau zu verwenden. Damit können Sie korrekte rekursive Funktionen schreiben, ohne den gesamten Aufrufbaum gedanklich simulieren zu müssen.

Das Framework wird manchmal als leap of faith bezeichnet: Sie vertrauen darauf, dass Ihre Funktion für kleinere Eingaben funktioniert, und verwenden diese Annahme, um die Lösung für größere Eingaben aufzubauen.

Schritt 1: Den Basisfall definieren

Der Basisfall ist die einfachste Eingabe, für die das Ergebnis ohne weitere Rekursion bekannt ist. Jede rekursive Funktion muss mindestens einen Basisfall haben; ohne ihn rekursiert die Funktion endlos (Stack Overflow). Gute Basisfälle sind: leere Liste, einzelnes Element, n == 0, n == 1 oder wenn sich das Problem auf eine triviale Identität reduzieren lässt.

Schreiben Sie den Basisfall zuerst, bevor Sie rekursive Logik hinzufügen. Ermitteln Sie ihn, indem Sie fragen: „Was ist die kleinste Variante dieses Problems, die ich sofort beantworten kann?“

# Base cases for common problems
def factorial(n):
    if n == 0:          # base case: 0! = 1
        return 1
    # ... recursive step below

def sum_list(lst):
    if not lst:         # base case: sum of empty list is 0
        return 0
    # ...

def height(node):
    if node is None:    # base case: height of null node is 0
        return 0
    # ...

print('Base cases identified')

Schritt 2: Dem rekursiven Aufruf vertrauen

Der Vertrauensschritt ist ein Vertrauenssprung: Nehmen Sie an, dass Ihre Funktion für jede Eingabe, die strikt kleiner als die aktuelle ist, bereits korrekt funktioniert. Sie müssen das jetzt nicht für jede kleinere Eingabe beweisen – der Induktionsbeweis garantiert es. Rufen Sie Ihre Funktion einfach für das kleinere Teilproblem auf und vertrauen Sie darauf, dass sie das richtige Ergebnis zurückgibt.

Diesen Schritt überspringen Anfänger häufig und versuchen stattdessen, den Ablauf gedanklich zu simulieren. Widerstehen Sie diesem Drang; sobald Sie das Schema verinnerlicht haben, lässt es sich auf Rekursionen beliebiger Tiefe übertragen.

# Trust example: sum_list([3, 1, 4, 1, 5])
# Trust: sum_list([1, 4, 1, 5]) = 11  (we TRUST this, don't trace it)
# Build: 3 + 11 = 14

# So:
def sum_list(lst):
    if not lst:
        return 0
    # Trust that sum_list(lst[1:]) returns sum of the rest
    return lst[0] + sum_list(lst[1:])

print(sum_list([3, 1, 4, 1, 5]))  # 14

Schritt 3: Die Lösung aufbauen

Im Aufbauschritt wird das vertrauenswürdige Ergebnis des Teilproblems mit dem Beitrag des aktuellen Elements kombiniert, um die Antwort für die vollständige Eingabe zu erzeugen. Dies ist normalerweise eine einzige Zeile: Wenden Sie eine Operation auf das aktuelle Element und das Ergebnis des rekursiven Aufrufs an. Häufige Aufbauschritte: zur Summe addieren, einer Liste voranstellen, den Zähler erhöhen, zwei Teilergebnisse kombinieren.

def factorial(n):
    if n == 0:
        return 1
    # Trust: factorial(n-1) gives (n-1)!
    # Build: n * (n-1)! = n!
    return n * factorial(n - 1)

def power(base, exp):
    if exp == 0:
        return 1
    # Trust: power(base, exp-1) gives base^(exp-1)
    # Build: base * base^(exp-1) = base^exp
    return base * power(base, exp - 1)

print(factorial(6))    # 720
print(power(2, 10))    # 1024

Das Schema auf die Ziffernsumme anwenden

Problem: Berechnen Sie die Ziffernsumme einer nicht negativen Ganzzahl. Basisfall: n == 0 → die Summe ist 0 (oder n < 10 → n selbst). Vertrauen: sumDigits(n // 10) gibt die Summe aller Ziffern außer der letzten zurück. Aufbau: Addieren Sie die letzte Ziffer n % 10 zum vertrauenswürdigen Ergebnis. Das Schema liefert die Lösung in drei deklarativen Schritten.

def sumDigits(n):
    if n < 10:
        return n            # base case: single digit
    # Trust: sumDigits(n // 10) gives sum of all digits except last
    # Build: add the last digit
    return n % 10 + sumDigits(n // 10)

print(sumDigits(0))      # 0
print(sumDigits(7))      # 7
print(sumDigits(123))    # 6
print(sumDigits(9999))   # 36

Fibonacci: Zwei Teilprobleme

Fibonacci erfordert zwei rekursive Aufrufe: fib(n-1) und fib(n-2). Wenden Sie das Schema an: Die Basisfälle sind fib(0) = 0 und fib(1) = 1. Vertrauen: Beide kleineren Aufrufe liefern die korrekten Fibonacci-Werte zurück. Aufbau: Geben Sie ihre Summe zurück. Diese naive Implementierung hat eine Laufzeit von O(2^n) – das beheben wir in der Lektion zur Memoisierung.

def fib(n):
    if n <= 1:
        return n      # base cases: fib(0)=0, fib(1)=1
    # Trust both smaller sub-problems
    return fib(n - 1) + fib(n - 2)

for i in range(8):
    print(f'fib({i}) = {fib(i)}')  # 0,1,1,2,3,5,8,13

Eine Zeichenkette rekursiv umkehren

Problem: Kehren Sie eine Zeichenkette rekursiv um. Basisfall: Eine leere Zeichenkette oder ein einzelnes Zeichen ist bereits umgekehrt. Vertrauen: reverse(s[1:]) gibt die Umkehrung von allem nach dem ersten Zeichen zurück. Aufbau: Hängen Sie das erste Zeichen am Ende des umgekehrten Suffixes an. Das Schema ergibt eine Lösung in drei Zeilen.

def reverse_str(s):
    if len(s) <= 1:
        return s            # base case
    # Trust: reverse_str(s[1:]) = reverse of 'ello' for 'hello'
    # Build: append first character at end
    return reverse_str(s[1:]) + s[0]

print(reverse_str(''))        # ''
print(reverse_str('a'))       # 'a'
print(reverse_str('hello'))   # 'olleh'
print(reverse_str('racecar')) # 'racecar'

Vorkommen rekursiv zählen

Problem: Zählen Sie rekursiv, wie oft ein Zielwert in einer Liste vorkommt. Basisfall: leere Liste – die Anzahl ist 0. Vertrauen: count(lst[1:], target) gibt die Anzahl im Rest der Liste zurück. Aufbau: Addieren Sie 1, wenn das erste Element dem Zielwert entspricht, andernfalls 0. Jeder rekursive Schritt führt zum Basisfall, indem die Listengröße um 1 reduziert wird.

def count_occurrences(lst, target):
    if not lst:
        return 0
    # Trust: count in rest of list is handled recursively
    # Build: add 1 if first element matches, else 0
    return (1 if lst[0] == target else 0) + count_occurrences(lst[1:], target)

print(count_occurrences([1, 2, 3, 2, 4, 2], 2))  # 3
print(count_occurrences([], 5))                    # 0
print(count_occurrences([7, 7, 7], 7))             # 3

Prüfen, ob eine Liste sortiert ist

Problem: Prüfen Sie rekursiv, ob eine Liste aufsteigend sortiert ist. Basisfall: Eine Liste mit 0 oder 1 Elementen ist immer sortiert. Vertrauen: is_sorted(lst[1:]) teilt Ihnen mit, ob der Rest der Liste sortiert ist. Aufbau: Die Liste ist sortiert, wenn das erste Element <= dem zweiten ist UND der Rest der Liste sortiert ist. Dies ist ein klares Beispiel dafür, dass der Aufbauschritt eine logische UND-Verknüpfung zweier Bedingungen verwendet.

def is_sorted(lst):
    if len(lst) <= 1:
        return True
    # Trust: is_sorted(lst[1:]) tells us if tail is sorted
    # Build: head <= second element AND tail is sorted
    return lst[0] <= lst[1] and is_sorted(lst[1:])

print(is_sorted([]))           # True
print(is_sorted([1]))          # True
print(is_sorted([1, 2, 3, 4])) # True
print(is_sorted([1, 3, 2, 4])) # False

Binärsuche rekursiv (erneut betrachtet)

Binärsuche rekursiv mit dem Schema formuliert: Basisfall: lo > hi → nicht gefunden (geben Sie -1 zurück). Vertrauen: Der rekursive Aufruf für die richtige Hälfte findet das Ziel oder gibt -1 zurück. Aufbau: Berechnen Sie mid, vergleichen Sie und rufen Sie die passende Hälfte auf. Die rekursive Form zeigt die Teile-und-herrsche-Struktur deutlich, obwohl in Produktionscode wegen des O(1)-Speicherbedarfs die iterative Form bevorzugt wird.

def binary_search(arr, target, lo, hi):
    if lo > hi:          # base case: search space exhausted
        return -1
    mid = lo + (hi - lo) // 2
    if arr[mid] == target:
        return mid
    # Trust both halves return correct results
    if arr[mid] < target:
        return binary_search(arr, target, mid + 1, hi)
    else:
        return binary_search(arr, target, lo, mid - 1)

arr = [1, 3, 5, 7, 9, 11]
print(binary_search(arr, 7, 0, len(arr) - 1))   # 3
print(binary_search(arr, 4, 0, len(arr) - 1))   # -1

Wann Sie Rekursion statt Iteration verwenden sollten

Rekursion eignet sich besonders, wenn sich ein Problem auf natürliche Weise in kleinere Teilprobleme desselben Typs zerlegen lässt (Bäume, Teile-und-herrsche, Backtracking). Iteration ist vorzuziehen, wenn: die Rekursionstiefe groß ist (wodurch in Python ein Stack Overflow droht, da standardmäßig etwa 1000 Ebenen zulässig sind), die rekursive und die iterative Variante gleich verständlich sind oder das Problem einer einfachen Schleife entspricht (Fakultät, Fibonacci ohne Memoisierung).

Eine gute Faustregel: Wenn es sich natürlich anfühlt, einen Rekursionsbaum zu zeichnen, verwenden Sie Rekursion. Wenn der Baum eine gerade Linie bildet (Endrekursion), wandeln Sie die Lösung in eine iterative um.

import sys

# Python's default recursion limit
print('Recursion limit:', sys.getrecursionlimit())  # 1000

# A list of 2000 elements would overflow the recursive sum_list
# Use iteration for safety:
def sum_list_iter(lst):
    total = 0
    for x in lst:
        total += x
    return total

big = list(range(2000))
print(sum_list_iter(big))  # 1999000 — no stack overflow

Schnelltest

Testen Sie Ihr Verständnis der Konzepte aus Data Structures & Algorithms — Coding Interview Prep in dieser Lektion.

Zusammenfassung der Lektion

In dieser Lektion haben Sie gelernt: Das dreistufige Schema besteht aus Basisfall (einfachste bekannte Antwort), Vertrauen (annehmen, dass das Teilproblem gelöst ist) und Aufbau (aktuelles Element mit dem vertrauenswürdigen Ergebnis kombinieren), schreiben Sie Basisfälle zuerst und versuchen Sie nicht, vollständige Aufrufbäume gedanklich nachzuverfolgen und verwenden Sie Iteration, wenn die Rekursionstiefe einen Stack Overflow riskiert oder die rekursive und iterative Form gleich klar sind. Als Nächstes visualisieren wir den Aufruf-Stack im Detail.

Häufig gestellte Fragen

Ist die Lektion „Rekursionsschema: Basisfall, Vertrauen, Aufbau“ kostenlos?

Ja — der vollständige Text von „Rekursionsschema: Basisfall, Vertrauen, Aufbau“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des DSA Interview Prep-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der DSA Interview Prep-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Rekursionsschema: Basisfall, Vertrauen, Aufbau“?

Wenden Sie die Drei-Schritte-Methode an, um korrekte rekursive Lösungen für Fakultät, Potenz und Ziffernsumme zu schreiben, ohne jeden Aufruf nachzuverfolgen. Du übst DSA Interview Prep mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.

Brauche ich Erfahrung, um DSA Interview Prep zu starten?

Keine Vorkenntnisse erforderlich. DSA Interview Prep auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 1 von 4.

Wie lange dauert die Lektion „Rekursionsschema: Basisfall, Vertrauen, Aufbau“?

Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.

Kann ich in dieser DSA Interview Prep-Lektion Code schreiben und ausführen?

Ja. Jede DSA Interview Prep-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.

Alle Lektionen in diesem Kurs

  1. Rekursionsschema: Basisfall, Vertrauen, Aufbau
  2. Den Aufrufstapel visualisieren
  3. Abwägungen zwischen rekursiv und iterativ
  4. Memoisation: Rekursive Ergebnisse zwischenspeichern
← Zurück zu DSA Interview Prep