Adloun

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