Renverser une liste, tester un palindrome
Exercice supplémentaire · niveau 1 (application) · mathématiques appliquées (ECG 1re année), chapitre 11 — Informatique et algorithmique · Boucles et listes
Énoncé
Écrire renverse(L) qui renvoie une nouvelle liste contenant les éléments de L dans l'ordre inverse, puis est_palindrome(L) qui teste si L se lit identiquement dans les deux sens.
Corrigé
Le code.
def renverse(L):
R = []
for i in range(len(L) - 1, -1, -1): # de len(L)-1 jusqu'a 0
R.append(L[i])
return R
def est_palindrome(L):
n = len(L)
for i in range(n // 2):
if L[i] != L[n - 1 - i]:
return False # HORS de la boucle serait faux
return True
print(renverse([1, 2, 3])) # [3, 2, 1]
print(est_palindrome([1, 2, 3, 2, 1])) # True
print(est_palindrome([1, 2, 3])) # False
print(est_palindrome([])) # True
Le parcours à l'envers. range(len(L) - 1, -1, -1) engendre les indices : la borne d'arrêt est exclue, c'est ce qui permet d'atteindre l'indice . Écrire range(len(L) - 1, 0, -1) oublierait le premier élément — une erreur silencieuse.
Le test du palindrome. On compare l'élément d'indice à son symétrique d'indice . Il suffit de parcourir la moitié de la liste : au-delà, on refait les mêmes comparaisons dans l'autre sens. Pour impair, l'élément central n'est comparé qu'à lui-même, ce qui est inutile mais sans danger — n // 2 l'exclut d'ailleurs du parcours.
Le return True est hors de la boucle. Placé dedans, il renverrait True dès la première paire concordante, sans examiner les suivantes : la fonction dirait « palindrome » pour , dont seule la première comparaison réussit. C'est l'erreur symétrique de celle du return False mal placé dans la recherche séquentielle.
Le cas de la liste vide. range(0) est vide, la boucle ne s'exécute pas et la fonction rend True : une liste vide est bien un palindrome. La convention est cohérente, mais elle mérite d'être vérifiée plutôt que subie.
Les autres exercices de ce chapitre Le cours du chapitre
Un blocage sur cet exercice ? Le tuteur d'Adloun guide par questions, sans donner la réponse.