AIUnlimited
🌳

AI-Fundamenten

🌱
AI Seeds

Begin bij nul

🌿
AI Sprouts

Bouw een fundament

🌳
AI Branches

Pas toe in de praktijk

🏕️
AI Canopy

Ga de diepte in

🌲
AI Forest

Beheers AI

🔨

AI-Meesterschap

✏️
AI Sketch

Begin bij nul

🪨
AI Chisel

Bouw een fundament

⚒️
AI Craft

Pas toe in de praktijk

💎
AI Polish

Ga de diepte in

🏆
AI Masterpiece

Beheers AI

📘

AI Praktijk

📖
Open-source modellen begrijpen

Fundamenten en bronnen voor open-source modellen

🎯
Van probleem naar modeltaak

Bedrijfsproblemen omzetten in modeltaken

⚡
Uw eerste model uitvoeren

Zie uw eerste resultaten in 30 minuten

🔧
Fijntuning en evaluatie

Modellen fijntunen en prestaties evalueren

🚀
Applicatiesystemen

Bouw echte AI-toepassingen

🎨
Generatieve AI

Verken open-source AIGC-modellen

🤖
Agents

Leer Agent-frameworks en MCP-tools

📐
Aanvullende fundamenten

LLM-basis en evaluatie

🎓

Claude Academie

🤖
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

Lab

7 experimenten geladen
🧬Neuraal Netwerk Sandbox🤖AI of Mens?🥋Prompt Engineering Dojo🏁Algoritme-race🧠AI-triviant🏗️Systeemontwerp Canvas
🎯Proef-sollicitatieGa naar het lab→
🚀

Carrièreontwikkeling

🚀
Interview Startplatform

Start je reis

🌟
Gedragsinterview Meesterschap

Beheers soft skills

💻
Technische Interviews

Slaag voor de codeerronde

🤖
AI- & ML-interviews

ML-interview meesterschap

🏆
Aanbod & verder

Bemachtig het beste aanbod

Begin met leren
AIUnlimited

MIT-licentie.

沪ICP备18025655号-11

Leren

  • AI-basis
  • AI Praktijk
  • Claude Academie
  • Lab
  • Carrièreontwikkeling

Community

  • Over ons
  • FAQ

Ondersteuning

  • footer.terms
  • footer.privacy
  • footer.contact
AI & Engineering Opleidingen›✏️ AI Sketch›Lessen›Recursie en backtracking
🧩
AI Sketch • Gemiddeld⏱️ 20 min leestijd

Recursie en backtracking

Recursie - De Basis

Een recursieve functie roept zichzelf aan met een kleinere versie van het probleem, totdat het een basisgeval bereikt dat de keten stopt.

Elke recursie heeft twee dingen nodig:

  1. Basisgeval - de eenvoudigste invoer waarbij je direct retourneert.
  2. Recursief geval - splits het probleem op en roep jezelf aan.
def factorial(n):
    if n <= 1:        # basisgeval
        return 1
    return n * factorial(n - 1)  # recursief geval

De Call Stack - Gevisualiseerd

Elke recursieve aanroep pusht een frame op de call stack. Wanneer het basisgeval retourneert, worden frames in omgekeerde volgorde ge-popt.

factorial(4)
  → factorial(3)
    → factorial(2)
      → factorial(1) → geeft 1 terug
    ← geeft 2 terug
  ← geeft 6 terug
← geeft 24 terug

Als er geen basisgeval is, loopt de stack over. Python's standaard recursielimiet is 1.000 frames.

🤯
Python's standaard recursielimiet van 1.000 is bewust conservatief. Je kunt het verhogen met sys.setrecursionlimit(), maar iteratieve oplossingen hebben doorgaans de voorkeur bij diepe recursie.

Fibonacci - De Klassieke Valkuil

De naïeve recursieve Fibonacci is O(2ⁿ) omdat het dezelfde deelproblemen herberekent. Memoisatie lost dit op in O(n) tijd en ruimte.

from functools import lru_cache

@lru_cache(maxsize=None)
def fib(n):
    if n < 2:
        return n
    return fib(n - 1) + fib(n - 2)
Recursieboom voor Fibonacci met herhaalde deelproblemen
Zonder memoisatie maakt fib(5) 15 aanroepen. Met memoisatie slechts 5.

Backtracking - Probeer Alles, Maak dan Ongedaan

Backtracking is recursie met een twist: je maakt een keuze, recurseert, en maakt de keuze ongedaan voordat je de volgende optie probeert. Zie het als het verkennen van een doolhof - loop vooruit, loop vast, loop terug, probeer het volgende pad.

Het Backtracking-Sjabloon

def backtrack(state, choices):
    if is_solution(state):
        result.append(state.copy())
        return
    for choice in choices:
        if is_valid(choice):
            state.add(choice)       # kies
            backtrack(state, ...)   # verken
            state.remove(choice)    # maak ongedaan

Dit drieledige patroon - kiezen, verkennen, ongedaan maken - is de ruggengraat van vrijwel elk backtracking-probleem.

Les 8 van 100% voltooid
←Patronen voor binair zoeken

Discussie

Inloggen deelnemen aan de discussie

🧠Snelle check

Waarom maken we de keuze ongedaan na de recursieve aanroep in het backtracking-sjabloon?

Permutaties

Genereer alle volgordes van [1, 2, 3]. Op elk niveau kies een ongebruikt getal, recurseer, en maak dan de keuze ongedaan.

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

Er zijn n! permutaties, dus de tijdcomplexiteit is O(n × n!).

Combinaties en Deelverzamelingen

Combinaties (n boven k): bij elk element neem je het op of sla je het over, maar recurseer alleen vooruit om duplicaten te vermijden.

Deelverzamelingen: zelfde idee zonder beperking - elk knooppunt in de recursieboom is een geldige deelverzameling. Er zijn 2ⁿ deelverzamelingen.

🤔
Think about it:Permutaties leveren n! resultaten op terwijl deelverzamelingen 2ⁿ opleveren. Voor n=10 is dat 3.628.800 vs 1.024 - een enorm verschil. Waarom?

N-Queens - Stap voor Stap

Plaats N koninginnen op een N×N-bord zodat geen enkele de ander aanvalt. Voor N=4:

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

Strategie: plaats één koningin per rij. Probeer voor elke rij elke kolom. Controleer kolom-, hoofddiagonaal- en antidiagonaalconflicten. Als veilig, plaats en recurseer naar de volgende rij. Als vast, backtrack.

Houd conflicten bij met drie sets: cols, diag (rij − kolom) en anti_diag (rij + kolom).

🧠Snelle check

Hoe controleren we diagonaalconflicten efficiënt bij het N-Queens-probleem?

Sudoku-Oplosser - Concept

Vind een lege cel, probeer cijfers 1–9. Controleer voor elk cijfer rij-, kolom- en 3×3-vakbeperkingen. Als geldig, plaats en recurseer. Als geen cijfer werkt, maak ongedaan en backtrack. De snoeiing door beperkingen maakt het haalbaar ondanks de enorme zoekruimte.

Woordzoeker in een Grid

Gegeven een 2D-bord met letters en een doelwoord: start vanuit elke cel en DFS in vier richtingen, één karakter per keer matchend. Markeer cellen als bezocht tijdens recursie en demarkeer bij backtrack om andere paden mogelijk te maken.

Tijdcomplexiteit van Backtracking

De kosten hangen af van de vertakkingsfactor (keuzes per stap) en diepte (stappen tot een oplossing). Voor b vertakkingen en d diepte: O(bᵈ).

| Probleem | Vertakking | Diepte | Complexiteit | |----------|------------|--------|-------------| | Permutaties | n, n−1, … | n | O(n!) | | Deelverzamelingen | 2 | n | O(2ⁿ) | | N-Queens | ~n | n | O(n!) slechtste geval |

Snoeiing voor Optimalisatie

Snoeiing (pruning) betekent het overslaan van takken die je weet dat ze falen. Voorbeelden:

  • N-Queens: sla bezette kolommen over.
  • Sudoku: sla cijfers over die beperkingen schenden.
  • Combinatiesom: sla over als resterende som < 0.

Goede snoeiing kan een onpraktische zoekopdracht omzetten in een snelle.

🧠Snelle check

Wat doet snoeiing (pruning) in een backtracking-algoritme?

🤔
Think about it:Veel backtracking-problemen kunnen ook met dynamic programming worden opgelost. Wat is het belangrijkste verschil in aanpak tussen de twee?

📚 Verder Lezen

  • NeetCode - Backtracking playlist - samengestelde problemen met video-uitleg
  • Tech Interview Handbook - Recursion - patronen en veelvoorkomende valkuilen
  • LeetCode Backtracking studieplan - progressieve probleemset