AI EducademyAIEducademy
🌳

Fondations IA

🌱
AI Seeds

Partez de zéro

🌿
AI Sprouts

Construisez les fondations

🌳
AI Branches

Mettez en pratique

🏕️
AI Canopy

Approfondissez

🌲
AI Forest

Maîtrisez l'IA

🔨

Maîtrise IA

✏️
AI Sketch

Partez de zéro

🪨
AI Chisel

Construisez les fondations

⚒️
AI Craft

Mettez en pratique

💎
AI Polish

Approfondissez

🏆
AI Masterpiece

Maîtrisez l'IA

🚀

Prêt pour la Carrière

🚀
Rampe de lancement entretien

Commencez votre parcours

🌟
Maîtrise comportementale

Maîtrisez les compétences relationnelles

💻
Entretiens techniques

Réussissez l'épreuve de code

🤖
Entretiens IA et ML

Maîtrisez l'entretien ML

🏆
Offre et au-delà

Décrochez la meilleure offre

Voir tous les programmes→

Labo

7 expériences chargées
🧠Terrain de jeu neuronal🤖IA ou humain ?💬Labo de prompts🎨Generateur d'images😊Analyseur de sentiment💡Constructeur de chatbot⚖️Simulateur d'ethique
🎯Entretien simuléEntrer dans le labo→
ParcoursBlog
🎯
À propos

Rendre l'éducation en IA accessible à tous, partout

❓
FAQ

Common questions answered

✉️
Contact

Get in touch with us

⭐
Open Source

Construit publiquement sur GitHub

Commencer gratuitement
AI EducademyAIEducademy

Licence MIT. Open Source

Apprendre

  • Programmes
  • Leçons
  • Labo

Communauté

  • GitHub
  • Contribuer
  • Code de conduite
  • À propos
  • FAQ

Soutien

  • Offrez-moi un café ☕
  • Conditions d'utilisation
  • Politique de confidentialité
  • Contact
Programmes d'IA et d'ingénierie›✏️ AI Sketch›Leçons›Récursivité et retour arrière
🧩
AI Sketch • Intermédiaire⏱️ 20 min de lecture

Récursivité et retour arrière

Les fondamentaux de la récursivité

Une fonction récursive s'appelle elle-même avec une version plus petite du problème jusqu'à atteindre un cas de base qui arrête la chaîne.

Toute récursion a besoin de deux choses :

  1. Cas de base - l'entrée la plus simple où l'on retourne directement.
  2. Cas récursif - décomposer le problème et s'appeler soi-même.
def factorial(n):
    if n <= 1:        # base case
        return 1
    return n * factorial(n - 1)  # recursive case

La pile d'appels - Visualisée

Chaque appel récursif empile un cadre (frame) sur la pile d'appels. Quand le cas de base retourne, les cadres se dépilent en ordre inverse.

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

Sans cas de base, la pile déborde. La limite de récursion par défaut de Python est de 1 000 frames.

🤯
La limite de récursion de Python (1 000) est volontairement prudente. On peut l'augmenter avec sys.setrecursionlimit(), mais les solutions itératives sont généralement préférées pour les récursions profondes.

Fibonacci - Le piège classique

Le Fibonacci récursif naïf est en O(2ⁿ) car il recalcule les mêmes sous-problèmes. La mémoïsation corrige cela en O(n) en temps et en espace.

from functools import lru_cache

@lru_cache(maxsize=None)
def fib(n):
    if n < 2:
        return n
    return fib(n - 1) + fib(n - 2)
Arbre de récursion pour Fibonacci montrant les sous-problèmes répétés
Sans mémoïsation, fib(5) effectue 15 appels. Avec, seulement 5.

Backtracking - Tout essayer, puis défaire

Le retour sur trace (backtracking) est la récursivité avec une astuce : on fait un choix, on recurse, puis on annule le choix avant d'essayer l'option suivante. Comme explorer un labyrinthe - avancer, atteindre un cul-de-sac, revenir en arrière, essayer un autre chemin.

Le template de backtracking

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

Ce patron en trois étapes - - est la colonne vertébrale de presque tout problème de backtracking.

Leçon 8 sur 100% terminé
←Patrons de recherche binaire

Discussion

Sign in to join the discussion

Suggérer une modification de cette leçon
choisir, explorer, annuler
🧠Vérification rapide

Dans le template de backtracking, pourquoi annule-t-on le choix après l'appel récursif ?

Permutations

Générer tous les ordres de [1, 2, 3]. À chaque niveau, choisir un nombre non utilisé, recurser, puis le retirer.

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

Il y a n! permutations, donc la complexité est O(n × n!).

Combinaisons et sous-ensembles

Combinaisons (n parmi k) : pour chaque élément, l'inclure ou le sauter, en ne récursant que vers l'avant pour éviter les doublons.

Sous-ensembles : même idée sans contrainte de taille - chaque nœud de l'arbre de récursion est un sous-ensemble valide. Il y a 2ⁿ sous-ensembles.

🤔
Think about it:Les permutations produisent n! résultats tandis que les sous-ensembles en produisent 2ⁿ. Pour n=10, c'est 3 628 800 contre 1 024 - une différence massive. Pourquoi ?

N-Queens - Pas à pas

Placer N reines sur un échiquier N×N de sorte qu'aucune ne s'attaque. Pour N=4 :

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

Stratégie : placer une reine par ligne. Pour chaque ligne, essayer chaque colonne. Vérifier les conflits de colonne, diagonale et anti-diagonale. Si c'est sûr, placer et recurser. Sinon, backtracker.

On suit les conflits avec trois ensembles : cols, diag (row − col) et anti_diag (row + col).

🧠Vérification rapide

Dans le problème des N-Queens, comment vérifie-t-on efficacement les conflits diagonaux ?

Solveur de Sudoku - Concept

Trouver une cellule vide, essayer les chiffres 1–9. Pour chaque chiffre, vérifier les contraintes de ligne, colonne et carré 3×3. Si valide, placer et recurser. Si aucun chiffre ne marche, annuler et backtracker.

Recherche de mot dans une grille

Étant donné un plateau 2D de lettres et un mot cible, démarrer depuis chaque cellule et DFS dans quatre directions, en faisant correspondre un caractère à la fois. Marquer les cellules visitées pendant la récursion et démarquer au backtrack.

Complexité du backtracking

Le coût dépend du facteur de branchement (choix par étape) et de la profondeur. Pour b branches et d profondeur : O(bᵈ).

| Problème | Branchement | Profondeur | Complexité | |----------|-------------|------------|------------| | Permutations | n, n−1, … | n | O(n!) | | Sous-ensembles | 2 | n | O(2ⁿ) | | N-Queens | ~n | n | O(n!) pire cas |

L'élagage pour optimiser

L'élagage (pruning) consiste à ignorer les branches vouées à l'échec :

  • N-Queens : sauter les colonnes déjà occupées.
  • Sudoku : sauter les chiffres qui violent les contraintes.
  • Somme de combinaisons : sauter si la somme restante < 0.

Un bon élagage peut rendre une recherche impraticable rapide.

🧠Vérification rapide

Que fait l'élagage dans un algorithme de backtracking ?

🤔
Think about it:De nombreux problèmes de backtracking peuvent aussi être résolus par programmation dynamique. Quelle est la différence clé d'approche entre les deux ?

📚 Pour aller plus loin

  • NeetCode - Playlist Backtracking - problèmes sélectionnés avec vidéos explicatives
  • Tech Interview Handbook - Recursion - patrons et pièges courants
  • LeetCode Backtracking study plan - ensemble progressif de problèmes