Écrire inverser(s) , qui renvoie la chaîne s lue à l'envers, par une…
Exercice d'entraînement · niveau 2 · NSI (première), chapitre 3 — Langages et programmation · Écrire et spécifier ses propres fonctions
Énoncé
Écrire inverser(s), qui renvoie la chaîne s lue à l'envers, par une boucle. Énoncer l'invariant. Quelle propriété peut-on tester sans écrire aucune réponse attendue à la main ?
Corrigé
def inverser(s):
"""Chaine s lue a l'envers.
Invariant : apres i tours, r contient les i premiers caracteres de s,
dans l'ordre inverse.
Postcondition : len(resultat) == len(s).
"""
r = ""
for c in s:
r = c + r
return r
L'invariant, et pourquoi il tient. On écrit r = c + r et non r = r + c : chaque nouveau caractère est placé devant les précédents. Après le premier tour, r contient le premier caractère ; après le deuxième, le deuxième suivi du premier ; et ainsi de suite. À la sortie, r contient tous les caractères en ordre inverse.
La propriété qui se teste sans réponse écrite à la main est l'involution : inverser deux fois redonne la chaîne de départ.
for _ in range(1000):
s = "".join(random.choice("abc") for _ in range(random.randint(0, 10)))
assert inverser(inverser(s)) == s
Les cas passent. C'est le même genre de test que l'aller-retour depuis_base(vers_base(n, b), b) == n du chapitre 1 — et il a la même limite : une fonction qui rendrait s inchangée passerait ce test sans broncher.
D'où quelques cas écrits à la main, indispensables : inverser("NSI") rend "ISN" — c'est celui-là qui élimine la fonction identité. inverser("") rend "", inverser("a") rend "a", et inverser("kayak") rend "kayak" : un palindrome, cas où le test d'involution est encore plus aveugle.
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.