Adloun

É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.