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