Objectifs de cette leçon
- Synthétiser toutes les notions algorithmiques apprises
- Concevoir un algorithme complet à partir d'un problème réel
- Combiner variables, conditions, boucles et fonctions
Projet récapitulatif : Fondamentaux 🎯
Bravo d'être arrivé jusqu'ici ! Cette leçon est un grand défi pour vérifier que tu as bien tout compris. Chaque exercice est expliqué simplement, avec la méthode et le pseudo-code avant le code Python.
💡 Avant de coder : essaie d'écrire la solution en pseudo-code sur une feuille, puis traduis-la en Python dans l'onglet Sandbox.
Exercices Étape 1 — Bases et logique 🧩
1. Factorielle — version itérative ET récursive 🔢
La factorielle de n (notée n!) c'est : n × (n-1) × (n-2) × … × 1. Exemple : 5! = 5 × 4 × 3 × 2 × 1 = 120
Méthode itérative (avec une boucle) : On multiplie les nombres de 1 à n dans une boucle.
Exécution pas à pas
pseudo1/8🧩FONCTION factorielle_iterative(n)FONCTION factorielle_iterative(n)Le programme exécute cette action, puis passe à la suivante.On définit une fonction appelée "factorielle_iterative(n)". Cette fonction contient des instructions qui seront exécutées quand on l'appelle.
Méthode récursive (la fonction s'appelle elle-même) :
- Cas de base : 0! = 1 et 1! = 1
- Appel récursif : n! = n × (n-1)!
Exécution pas à pas
pseudo1/8🧩FONCTION factorielle_recursive(n)FONCTION factorielle_recursive(n)Le programme exécute cette action, puis passe à la suivante.On définit une fonction appelée "factorielle_recursive(n)". Cette fonction contient des instructions qui seront exécutées quand on l'appelle.
def factorielle_iterative(n): resultat = 1 for i in range(1, n + 1): resultat = resultat * i return resultat def factorielle_recursive(n): if n <= 1: return 1 return n * factorielle_recursive(n - 1) print(factorielle_iterative(5)) # 120 print(factorielle_recursive(5)) # 120
🎯 Teste avec : 0! = 1, 3! = 6, 7! = 5040
2. Suite de Fibonacci — itératif ET récursif 🌀
Fibonacci : chaque nombre est la somme des deux précédents. Suite : 0, 1, 1, 2, 3, 5, 8, 13, 21, 34…
- F(0) = 0, F(1) = 1
- F(2) = 1, F(3) = 2, F(4) = 3, F(5) = 5…
Méthode itérative : On garde les deux dernières valeurs en mémoire.
Exécution pas à pas
pseudo1/14🧩FONCTION fibonacci_iterative(n)FONCTION fibonacci_iterative(n)Le programme exécute cette action, puis passe à la suivante.On définit une fonction appelée "fibonacci_iterative(n)". Cette fonction contient des instructions qui seront exécutées quand on l'appelle.
Méthode récursive : Élégante mais plus lente.
Exécution pas à pas
pseudo1/8🧩FONCTION fibonacci_recursive(n)FONCTION fibonacci_recursive(n)Le programme exécute cette action, puis passe à la suivante.On définit une fonction appelée "fibonacci_recursive(n)". Cette fonction contient des instructions qui seront exécutées quand on l'appelle.
def fibonacci_iterative(n): if n <= 1: return n a, b = 0, 1 for _ in range(2, n + 1): a, b = b, a + b return b def fibonacci_recursive(n): if n <= 1: return n return fibonacci_recursive(n-1) + fibonacci_recursive(n-2) print(fibonacci_iterative(10)) # 55 print(fibonacci_recursive(10)) # 55
🎯 Teste avec : F(0) = 0, F(1) = 1, F(6) = 8, F(20) = 6765
3. Vérifier si un nombre est premier 🔍
Un nombre premier est divisible seulement par 1 et par lui-même. Exemples : 2, 3, 5, 7, 11, 13… (1 n'est PAS premier)
Méthode : On teste tous les diviseurs de 2 à √n. Si aucun ne divise n, alors n est premier.
Exécution pas à pas
pseudo1/12🧩FONCTION est_premier(n)FONCTION est_premier(n)Le programme exécute cette action, puis passe à la suivante.On définit une fonction appelée "est_premier(n)". Cette fonction contient des instructions qui seront exécutées quand on l'appelle.
import math def est_premier(n): if n <= 1: return False for i in range(2, int(math.sqrt(n)) + 1): if n % i == 0: return False return True print(est_premier(7)) # True print(est_premier(8)) # False print(est_premier(97)) # True
💡 Pourquoi √n ? Si n = a × b, au moins un des deux facteurs est ≤ √n. Pas besoin de chercher plus loin !
4. Inverser une chaîne de caractères 🔄
"hello" à l'envers → "olleh"
Exécution pas à pas
pseudo1/8🧩FONCTION inverser_chaine(s)FONCTION inverser_chaine(s)Le programme exécute cette action, puis passe à la suivante.On définit une fonction appelée "inverser_chaine(s)". Cette fonction contient des instructions qui seront exécutées quand on l'appelle.
def inverser_chaine(s): resultat = "" for i in range(len(s) - 1, -1, -1): # On part de la fin resultat = resultat + s[i] # On ajoute chaque caractère return resultat print(inverser_chaine("hello")) # "olleh" print(inverser_chaine("12345")) # "54321"
💡 Astuce : En Python, tu peux aussi écrire
s[::-1]— mais le but ici est de comprendre la logique !
5. Vérifier un palindrome 🪞
Un palindrome se lit pareil dans les deux sens : "kayak", "radar", "été", "ressasser".
Exécution pas à pas
pseudo1/13🧩FONCTION est_palindrome(s)FONCTION est_palindrome(s)Le programme exécute cette action, puis passe à la suivante.On définit une fonction appelée "est_palindrome(s)". Cette fonction contient des instructions qui seront exécutées quand on l'appelle.
def est_palindrome(s): debut = 0 fin = len(s) - 1 while debut < fin: if s[debut] != s[fin]: return False debut = debut + 1 fin = fin - 1 return True print(est_palindrome("kayak")) # True print(est_palindrome("hello")) # False print(est_palindrome("radar")) # True
🎯 Défi : Peux-tu adapter la fonction pour ignorer les espaces et majuscules ? ("Esope reste ici et se repose" → palindrome !)
Exercices Étape 2 — Tableaux et complexité 📊
6. Trouver le max et le min d'un tableau 🏆
Exécution pas à pas
pseudo1/20🧩FONCTION trouver_max(tab)FONCTION trouver_max(tab)Le programme exécute cette action, puis passe à la suivante.On définit une fonction appelée "trouver_max(tab)". Cette fonction contient des instructions qui seront exécutées quand on l'appelle.
def trouver_max(tab): max_val = tab[0] for val in tab: if val > max_val: max_val = val return max_val def trouver_min(tab): min_val = tab[0] for val in tab: if val < min_val: min_val = val return min_val notes = [15, 12, 18, 10, 14] print(trouver_max(notes)) # 18 print(trouver_min(notes)) # 10
⏱ Complexité : O(n) — on parcourt le tableau une fois.
7. Trouver les doublons 👯
Trouve les nombres qui apparaissent plusieurs fois dans un tableau.
Exécution pas à pas
pseudo1/15🧩FONCTION trouver_doublons(tab)FONCTION trouver_doublons(tab)Le programme exécute cette action, puis passe à la suivante.On définit une fonction appelée "trouver_doublons(tab)". Cette fonction contient des instructions qui seront exécutées quand on l'appelle.
def trouver_doublons(tab): deja_vu = [] doublons = [] for valeur in tab: if valeur in deja_vu: if valeur not in doublons: doublons.append(valeur) else: deja_vu.append(valeur) return doublons print(trouver_doublons([3, 1, 4, 1, 5, 3])) # [1, 3]
🎯 Défi : Essaie de le faire avec un
setou un dictionnaire pour que ce soit plus rapide !
8. Two Sum — trouver deux nombres qui font une somme cible 🎯
Étant donné un tableau [2, 7, 11, 15] et une cible 9, trouve les deux nombres qui additionnés donnent 9 (ici 2 + 7 = 9).
Exécution pas à pas
pseudo1/11🧩FONCTION two_sum(tab, cible)FONCTION two_sum(tab, cible)Le programme exécute cette action, puis passe à la suivante.On définit une fonction appelée "two_sum(tab, cible)". Cette fonction contient des instructions qui seront exécutées quand on l'appelle.
def two_sum(tab, cible): for i in range(len(tab)): for j in range(i + 1, len(tab)): if tab[i] + tab[j] == cible: return [i, j] return [] print(two_sum([2, 7, 11, 15], 9)) # [0, 1] (car 2 + 7 = 9) print(two_sum([3, 2, 4], 6)) # [1, 2] (car 2 + 4 = 6)
⏱ Complexité : O(n²) — deux boucles imbriquées. Pour t'entraîner, cherche une version en O(n) avec un dictionnaire !
9. Rotation d'un tableau 🔄
Décale tous les éléments d'un tableau de k positions vers la droite.
Exemple : [1, 2, 3, 4, 5] avec k = 2 → [4, 5, 1, 2, 3]
Exécution pas à pas
pseudo1/11🧩FONCTION rotation(tab, k)FONCTION rotation(tab, k)Le programme exécute cette action, puis passe à la suivante.On définit une fonction appelée "rotation(tab, k)". Cette fonction contient des instructions qui seront exécutées quand on l'appelle.
def rotation(tab, k): n = len(tab) k = k % n # Si k est plus grand que n resultat = [0] * n for i in range(n): nouvel_index = (i + k) % n resultat[nouvel_index] = tab[i] return resultat print(rotation([1, 2, 3, 4, 5], 2)) # [4, 5, 1, 2, 3] print(rotation([1, 2, 3], 5)) # [2, 3, 1] (car 5%3=2)
💡 Le
%(modulo) fait "reboucler" l'index : si on dépasse la fin, on revient au début.
10. Fusionner deux tableaux triés ➕
On a deux tableaux déjà triés, on veut les fusionner en un seul tableau trié.
Exemple : [1, 3, 5] + [2, 4, 6] → [1, 2, 3, 4, 5, 6]
Exécution pas à pas
pseudo1/22🧩FONCTION fusionner_tries(tab1, tab2)FONCTION fusionner_tries(tab1, tab2)Le programme exécute cette action, puis passe à la suivante.On définit une fonction appelée "fusionner_tries(tab1, tab2)". Cette fonction contient des instructions qui seront exécutées quand on l'appelle.
def fusionner_tries(tab1, tab2): i = j = 0 resultat = [] while i < len(tab1) and j < len(tab2): if tab1[i] < tab2[j]: resultat.append(tab1[i]) i += 1 else: resultat.append(tab2[j]) j += 1 # Ajouter les éléments restants while i < len(tab1): resultat.append(tab1[i]) i += 1 while j < len(tab2): resultat.append(tab2[j]) j += 1 return resultat print(fusionner_tries([1, 3, 5], [2, 4, 6])) # [1, 2, 3, 4, 5, 6] print(fusionner_tries([1, 2, 3], [4, 5])) # [1, 2, 3, 4, 5]
⏱ Complexité : O(n + m) — on parcourt chaque tableau une seule fois.
Vérification des acquis ✅
Avant de passer à la suite, assure-toi de savoir :
- ✅ Écrire une fonction itérative ET récursive (factorielle, Fibonacci)
- ✅ Reconnaître un nombre premier
- ✅ Inverser une chaîne / vérifier un palindrome
- ✅ Parcourir un tableau et trouver le max/min
- ✅ Fusionner deux tableaux triés
🎉 Bravo ! Si tu arrives à faire ces 10 exercices sans regarder les solutions, tu as un super niveau en algorithmique de base ! Passe à la leçon suivante pour découvrir la complexité algorithmique.
⚡ Simulateur — Factorielle itérative
Étape 1/15Factorielle itérative : multiplication de 1 à n.
⚡ Simulateur — Factorielle récursive
Étape 1/15Appel : factorielle_recursive(5).