AIUnlimited
🌳

KI-Grundlagen

🌱
AI Seeds

Starte bei null

🌿
AI Sprouts

Fundament aufbauen

🌳
AI Branches

In der Praxis anwenden

🏕️
AI Canopy

In die Tiefe gehen

🌲
AI Forest

KI meistern

🔨

KI-Meisterschaft

✏️
AI Sketch

Starte bei null

🪨
AI Chisel

Fundament aufbauen

⚒️
AI Craft

In der Praxis anwenden

💎
AI Polish

In die Tiefe gehen

🏆
AI Masterpiece

KI meistern

📘

KI-Praxis

📖
Open-Source-Modelle verstehen

Grundlagen und Ressourcen für Open-Source-Modelle

🎯
Vom Problem zur Modellaufgabe

Geschäftsprobleme in Modellaufgaben umwandeln

⚡
Ihr erstes Modell ausführen

Sehen Sie Ihre ersten Ergebnisse in 30 Minuten

🔧
Fine-Tuning und Evaluierung

Modelle feinjustieren und Leistung bewerten

🚀
Anwendungssysteme

Bauen Sie reale KI-Anwendungen

🎨
Generative KI

Erkunden Sie Open-Source-AIGC-Modelle

🤖
Agenten

Lernen Sie Agent-Frameworks und MCP-Werkzeuge

📐
Ergänzende Grundlagen

LLM-Grundlagen und Evaluierung

🎓

Claude Akademie

🤖
Claude 101

Learn AI basics with Claude

💻
Claude Code 101

Code with Claude as your pair programmer

🤝
Introduction to Claude Cowork

Collaborate with Claude on complex projects

⚙️
Claude Platform 101

Build apps with the Claude API

Labor

7 Experimente geladen
🧬Neuronales Netz Sandbox🤖KI oder Mensch?🥋Prompt Engineering Dojo🏁Algorithmus-Rennen🧠KI-Quizduell🏗️Systemdesign-Leinwand
🎯ProbeinterviewLabor betreten→
🚀

Karriereentwicklung

🚀
Interview-Startrampe

Starte deine Reise

🌟
Verhaltensinterview-Meisterschaft

Soft Skills meistern

💻
Technische Interviews

Die Coding-Runde bestehen

🤖
AI- & ML-Interviews

ML-Interview meistern

🏆
Angebot & Karriere

Das beste Angebot sichern

Loslegen
AIUnlimited

MIT-Lizenz

沪ICP备18025655号-11

Lernen

  • KI-Grundlagen
  • KI-Praxis
  • Claude Akademie
  • Labor
  • Karriereentwicklung

Community

  • Über uns
  • FAQ

Unterstützung

  • Nutzungsbedingungen
  • Datenschutzerklärung
  • Kontakt
KI & Engineering Programme›✏️ AI Sketch›Lektionen›Rekursion und Backtracking
🧩
AI Sketch • Fortgeschritten⏱️ 20 Min. Lesezeit

Rekursion und Backtracking

Rekursionsgrundlagen

Eine rekursive Funktion ruft sich selbst mit einer kleineren Version des Problems auf, bis sie auf einen Basisfall trifft, der die Kette stoppt.

Jede Rekursion benötigt zwei Dinge:

  1. Basisfall – die einfachste Eingabe, bei der Sie direkt zurückkehren.
  2. Rekursiver Fall – brechen Sie das Problem auf und rufen Sie sich selbst an.
def factorial(n):
    if n <= 1:        # base case
        return 1
    return n * factorial(n - 1)  # recursive case

Der Aufrufstapel – visualisiert

Jeder rekursive Aufruf schiebt einen Frame auf den Aufrufstapel. Wenn der Basisfall zurückkehrt, werden die Frames in umgekehrter Reihenfolge angezeigt.

factorial(4)
  → factorial(3)
    → factorial(2)
      → factorial(1) → returns 1
    ← returns 2
  ← returns 6
← returns 24

Wenn kein Basisfall vorliegt, läuft der Stapel über. Das Standard-Rekursionslimit von Python beträgt 1.000 Frames.

🤯
Pythons standardmäßiges Rekursionslimit von 1.000 ist absichtlich konservativ. Sie können es mit sys.setrecursionlimit() erhöhen, für eine tiefe Rekursion werden jedoch normalerweise iterative Lösungen bevorzugt.

Fibonacci – Die klassische Falle

Das naive rekursive Fibonacci ist O(2ⁿ), weil es dieselben Teilprobleme neu berechnet. Durch Auswendiglernen wird dies in O(n) Zeit und Raum behoben.

from functools import lru_cache

@lru_cache(maxsize=None)
def fib(n):
    if n < 2:
        return n
    return fib(n - 1) + fib(n - 2)
Rekursionsbaum für Fibonacci, der wiederholte Teilprobleme zeigt
Ohne Memoisierung führt fib(5) 15 Aufrufe durch. Damit nur 5.

Backtracking – Alles ausprobieren und dann rückgängig machen

Backtracking ist eine Rekursion mit einer Wendung: Sie treffen eine Wahl, rekursieren und machen dann die Wahl rückgängig, bevor Sie die nächste Option ausprobieren. Stellen Sie sich vor, Sie erkunden ein Labyrinth: Gehen Sie vorwärts, geraten Sie in eine Sackgasse, gehen Sie zurück, versuchen Sie den nächsten Weg.

Die Backtracking-Vorlage

def backtrack(state, choices):
    if is_solution(state):
        result.append(state.copy())
        return
    for choice in choices:
        if is_valid(choice):
            state.add(choice)       # choose
            backtrack(state, ...)   # explore
            state.remove(choice)    # un-choose
Lektion 8 von 100% abgeschlossen
←Binäre Suchmuster

Diskussion

Anmelden an der Diskussion teilnehmen

Dieses dreistufige Muster – „Auswählen, Erkunden, Auswahl aufheben“ – ist das Rückgrat fast aller Backtracking-Probleme.

🧠Kurzer Check

Warum machen wir in der Backtracking-Vorlage die Auswahl nach dem rekursiven Aufruf rückgängig?

Permutationen

Generieren Sie alle Bestellungen von [1, 2, 3]. Wählen Sie auf jeder Ebene eine nicht verwendete Zahl aus, führen Sie eine Rekursion durch und heben Sie die Auswahl dann auf.

         []
      /   |   \
    [1]  [2]  [3]
    / \   ...
 [1,2] [1,3]
   |      |
[1,2,3] [1,3,2]  ... (6 total)

Es gibt n! Permutationen, daher beträgt die Zeitkomplexität O(n × n!).

Kombinationen und Teilmengen

Kombinationen (n wähle k): Fügen Sie es bei jedem Element ein oder überspringen Sie es, aber rekursieren Sie nur vorwärts, um Duplikate zu vermeiden.

Teilmengen: Dieselbe Idee ohne Größenbeschränkung – jeder Knoten im Rekursionsbaum ist eine gültige Teilmenge. Es gibt 2ⁿ Teilmengen.

🤔
Think about it:Permutationen ergeben n! Ergebnisse, während Teilmengen 2ⁿ produzieren. Für n=10 sind das 3.628.800 gegenüber 1.024 – ein gewaltiger Unterschied. Warum?

N-Queens – Komplettlösung

Platzieren Sie N Damen auf einem N×N-Brett, sodass sich keine gegenseitig angreift. Für N=4:

. Q . .
. . . Q
Q . . .
. . Q .

Strategie: Platziere eine Königin pro Reihe. Probieren Sie für jede Zeile jede Spalte aus. Überprüfen Sie Spalten-, Hauptdiagonalen- und Antidiagonalkonflikte. Wenn sicher, platzieren Sie es und kehren Sie zur nächsten Zeile zurück. Wenn Sie nicht weiterkommen, machen Sie einen Rückzieher.

Verfolgen Sie Konflikte mit drei Sätzen: cols, diag (Zeile − Spalte) und anti_diag (Zeile + Spalte).

🧠Kurzer Check

Wie können wir beim N-Queens-Problem effizient Diagonalkonflikte prüfen?

Sudoku-Löser - Konzept

Suchen Sie eine leere Zelle und probieren Sie die Ziffern 1–9 aus. Überprüfen Sie für jede Ziffer die Zeilen-, Spalten- und 3×3-Box-Einschränkungen. Wenn gültig, platzieren und rekursieren. Wenn keine Ziffer funktioniert, machen Sie den Vorgang rückgängig und gehen Sie zurück. Die Beschränkung auf Einschränkungen macht es trotz des riesigen Suchraums handhabbar.

Wortsuche in einem Raster

Beginnen Sie bei einer 2D-Buchstabentafel und einem Zielwort in jeder Zelle und führen Sie DFS in vier Richtungen durch, wobei Sie jeweils ein Zeichen nach dem anderen abgleichen. Markieren Sie Zellen während der Rekursion als besucht und heben Sie die Markierung beim Zurückverfolgen auf, um andere Pfade zuzulassen.

Zeitliche Komplexität des Backtrackings

Die Kosten hängen vom Verzweigungsfaktor (Auswahlmöglichkeiten pro Schritt) und der Tiefe (Schritte zu einer Lösung) ab. Für b-Zweige und d-Tiefe: O(bᵈ).

| Problem | Verzweigung | Tiefe | Komplexität | |---------|-----------|-------|------------| | Permutationen | n, n−1, … | n | O(n!) | | Teilmengen | 2 | n | O(2ⁿ) | | N-Queens | ~n | n | O(n!) schlimmster Fall |

Beschneiden zur Optimierung

Beschneiden bedeutet, Zweige zu überspringen, von denen Sie wissen, dass sie scheitern werden. Beispiele:

  • N-Queens: bereits belegte Spalten überspringen.
  • Sudoku: Ziffern überspringen, die gegen Einschränkungen verstoßen.
  • Kombinationssumme: überspringen, wenn Restsumme < 0.

Ein guter Schnitt kann aus einer unpraktischen Suche eine schnelle machen.

🧠Kurzer Check

Was bewirkt das Beschneiden in einem Backtracking-Algorithmus?

🤔
Think about it:Viele Backtracking-Probleme können auch mit dynamischer Programmierung gelöst werden. Was ist der Hauptunterschied im Ansatz zwischen den beiden?

📚 Weiterführende Literatur

  • NeetCode – Backtracking-Playlist – kuratierte Probleme mit Video-Komplettlösungen
  • Tech Interview Handbook – Recursion – Muster und häufige Fallstricke
  • LeetCode Backtracking-Lernplan – progressiver Aufgabensatz