Adloun

Écrire toutes occurrences(t, v), qui rend le tableau des indices

Exercice d'entraînement · niveau 2 · NSI (première), chapitre 7 — Parcourir, trier, prouver · Parcours, occurrences, cas limites

Énoncé

Écrire toutes_occurrences(t, v), qui rend le tableau des indices. Quelle postcondition la relie aux trois fonctions déjà écrites ?

Corrigé


def toutes_occurrences(t, v):
    """Indices de toutes les occurrences de v, par ordre croissant.

    Postcondition : le résultat est croissant, t[i] == v pour chacun de
                    ses éléments i, et sa longueur vaut
                    compte_occurrences(t, v).
    """
    res = []
    for i in range(len(t)):
        if t[i] == v:
            res.append(i)
    return res

toutes_occurrences([3, 1, 3, 7, 3], 3)     # [0, 2, 4]

Elle contient les trois autres. C'est la postcondition intéressante :


o = toutes_occurrences(t, v)
assert len(o) == compte_occurrences(t, v)
assert (o[0] if o else -1) == recherche(t, v)              # la premiere
assert (o[-1] if o else -1) == derniere_occurrence(t, v)   # la derniere

tableaux tirés au hasard passent les trois assertions, listes vides comprises — d'où le if o else -1, qui rend la convention du .

Alors pourquoi garder les trois autres ? Parce qu'elles sortent tôt. Sur un tableau d'un million d'éléments dont le premier convient, recherche fait une comparaison, toutes_occurrences en fait un million. La fonction la plus générale n'est pas la plus économique — c'est le contraire.

Et la mémoire. toutes_occurrences peut rendre un tableau aussi grand que t — si toutes les valeurs sont égales à v. Les trois autres rendent un entier. Ce sont trois fonctions différentes parce qu'elles répondent à trois questions différentes, pas par redondance.

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.