Exercice 2 - Partie A · Bac Numérique et Sciences Informatiques Antilles-Guyane 2026 (jour 1)
Thème : Récursivité · Tiré du sujet Jour 1 (2026)
Énoncé
Exercice 2 (6 points)
Cet exercice porte sur l'algorithmique et la programmation Python.
La recherche d'une plus longue sous-liste commune à deux listes est un problème connu sous le nom de « Longest Common Subsequence » (LCS).
Les éléments d'une plus longue sous-liste commune sont des éléments communs aux deux listes initiales, où ils apparaissent dans le même ordre, mais pas nécessairement de façon contiguë. Ainsi, les listes L_1 = [9, 3, 7, 5, 8] et L_2 = [9, 7, 8, 3, 7, 3] ont notamment en commun les sous-listes [], [9], [3], [9, 7], [9, 3, 7] ou [9, 7, 8]. Les plus longues sous-listes communes à ces deux listes sont [9, 3, 7] et [9, 7, 8], de longueur commune égale à 3.
En Python, il est possible d'obtenir la concaténée de deux valeurs de types list en utilisant +. Par exemple, [1, 2] + [3, 4] s'évalue à [1, 2, 3, 4] et []+[1] s'évalue à [1].
Partie A
Dans cette partie, on s'attache à déterminer une LCS selon la stratégie de « recherche exhaustive ». La première fonction implémentée construit toutes les sous-listes d'une liste passée en paramètre, en appliquant l'algorithme suivant:
Fonction sous_listes(L: list, accumulateur: list[list])
->list[list]
Début
| Si L est vide alors
| | renvoyer l'accumulateur (initialement égal à [[]])
| Sinon
| | Extraire e le dernier élément de L
| | Créer L_t une liste temporaire vide
| | Ajouter dans L_t chaque sous-liste présente dans
| | l'accumulateur, après lui avoir ajouté, en tête, e
| | Renvoyer le résultat d'un nouvel appel à la fonction
| | avec pour paramètres
| | - la liste diminuée de cet élément e
| | - l'union des éléments de l'accumulateur et de la
| | liste temporaire
| FinSi
Fin
1.
Recopier et compléter le tableau suivant, en indiquant la valeur des paramètres lors des appels récursifs, pour un appel initial sous_listes([9, 3, 7], [[]]).
Évolution des paramètres lors des appels récursifs
Appel
liste
accumulateur
appel initial
[9, 3, 7]
[[]]
1er sous-appel
[9, 3]
[[], [7]]
2nd sous-appel
dernier sous-appel
2.
La fonction suivante implémente l'algorithme étudié précédemment.
1 def sous_listes(liste: list, accumulateur = [[]]):
2 if len(liste) == 0:
3 return accumulateur
4 element = liste.pop()
5 tmp = []
6 for sous_liste in accumulateur:
7 tmp.append(...)
8 return sous_listes(...)
Recopier et compléter les lignes 7 et 8 du code de la fonction sous_listes.
3.
On implémente la fonction est_extraite ci-dessous qui renvoie True si une sous-liste peut être extraite d'une liste donnée et False sinon.
def est_extraite(sous_liste: list, liste: list):
index_ss_liste, index_liste = 0, 0
while index_ss_liste < len(sous_liste) and index_liste < len(liste):
if sous_liste[index_ss_liste] == liste[index_liste]:
index_ss_liste += 1
index_liste += 1
return index_ss_liste == len(sous_liste)
On implémente la fonction lcs_force_brute ci-dessous qui détermine une plus longue sous-liste commune à deux listes données et qui renvoie cette liste.
def lcs_force_brute(liste_1: list, liste_2: list):
tmp = sous_listes(liste_1)
resultat, maxi = [], 0
for element in tmp:
if est_extraite(element, liste_2) and len(element) > maxi:
resultat = element
maxi = len(element)
return resultat
Expliquer pourquoi l'exécution de la fonction lcs_force_brute risque de prendre beaucoup de temps selon la longueur des listes passées en paramètre. Justifier.

Corrigé
Corrigé proposé par AprenAI (non officiel)
1. Tableau - 2nd sous-appel : valeur du paramètre liste
Réponse : [9]
1. Tableau - 2nd sous-appel : valeur du paramètre accumulateur
Réponse : [[], [7], [3], [3, 7]]
1. Tableau - dernier sous-appel : valeur du paramètre liste
Réponse : []
1. Tableau - dernier sous-appel : valeur du paramètre accumulateur
Réponse : [[], [7], [3], [3, 7], [9], [9, 7], [9, 3], [9, 3, 7]]
Les réponses des 3 questions restantes et l’explication pas à pas sont réservées aux membres Premium. Premium
Résous-le ici : correction automatique, indices et corrigé détaillé.
Exercice 3 - Partie B · Antilles-Guyane 2026 (jour 2) ›