Écrire derniere occurrence(t, v)
Application directe du cours · niveau 1 (application) · NSI (première), chapitre 7 — Parcourir, trier, prouver · Parcours élémentaires
Énoncé
Écrire derniere_occurrence(t, v). Quelle postcondition ? Peut-on la déduire d'un simple parcours inversé ?
Corrigé
def derniere_occurrence(t, v):
"""Indice de la DERNIÈRE occurrence de v dans t, ou -1 si absente.
Postcondition : si le résultat r vaut -1, aucun élément de t n'est
égal à v ; sinon t[r] == v et aucun élément d'indice
strictement supérieur à r n'est égal à v.
"""
for i in range(len(t) - 1, -1, -1):
if t[i] == v:
return i
return -1
Oui, et c'est exactement cela. Le range(len(t) - 1, -1, -1) parcourt les indices de à : on rencontre donc la dernière occurrence en premier. Les trois arguments se lisent « de , jusqu'à exclu, par pas de » — la borne est là pour que soit visité.
La postcondition est le miroir exact de celle de recherche : « aucun d'indice inférieur » y devient « aucun d'indice supérieur ». L'invariant se transporte de même : avant le tour , aucun des éléments t[i+1..n-1] n'est égal à v.
Contrôle. Sur [3, 1, 3, 7, 3] en cherchant : derniere_occurrence rend , recherche rend . La postcondition entière a été vérifiée sur tableaux tirés au hasard.
L'autre voie, à écarter. On pourrait parcourir à l'endroit en mémorisant le dernier indice vu, sans jamais sortir tôt. C'est correct, mais cela paie toujours comparaisons, là où le parcours inversé s'arrête dès qu'il a trouvé.
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.