Adloun

Écrire renverser(t) , qui renverse le tableau en place par échanges…

Exercice d'entraînement · niveau 2 · NSI (première), chapitre 4 — Les types construits · Tableaux, compréhensions et coût

Énoncé

Écrire renverser(t), qui renverse le tableau en place par échanges successifs. Combien d'échanges faut-il ? Énoncer l'invariant. Que se passe-t-il si l'on écrit range(n) au lieu de range(n // 2) ?

Corrigé


def renverser(t):
    """Renverse le tableau t EN PLACE, par echanges.

    Invariant : apres k echanges, les k premiers et les k derniers
                elements sont a leur place definitive.
    """
    n = len(t)
    for i in range(n // 2):
        t[i], t[n - 1 - i] = t[n - 1 - i], t[i]
    return t

L'échange se fait par affectation multiple, sans variable temporaire : c'est la méthode a, b = b, a du cours, appliquée à deux cases d'un même tableau.

Le nombre d'échanges : . Chaque échange place deux éléments. Sur un tableau de longueur impaire, l'élément du milieu est déjà à sa place — il s'échangerait avec lui-même. La division entière n // 2 traite les deux parités d'un coup : éléments donnent échanges, éléments également .

Si l'on écrit range(n).


def renverser_faux(t):
    n = len(t)
    for i in range(n):
        t[i], t[n - 1 - i] = t[n - 1 - i], t[i]
    return t

print(renverser_faux([1, 2, 3, 4]))      # [1, 2, 3, 4]

On retrouve le tableau de départ : la seconde moitié de la boucle refait, à l'envers, les échanges de la première. Chaque paire est échangée deux fois, ce qui la remet en place. Le symptôme est trompeur — la fonction paraît « ne rien faire » alors qu'elle travaille deux fois trop.

Vérification.


assert renverser([1, 2, 3, 4]) == [4, 3, 2, 1]
assert renverser([1, 2, 3]) == [3, 2, 1]
assert renverser([]) == [] and renverser([7]) == [7]

for _ in range(1000):
    t = [random.randint(0, 9) for _ in range(random.randint(0, 10))]
    c = list(t)
    c.reverse()
    assert renverser(list(t)) == c

Les cas passent. Le tableau à trois éléments est le cas de test décisif : c'est lui qui vérifie que le milieu est bien laissé tranquille.

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.