Adloun

L'échange t i, t m = t m, t i se passe de variable temporaire

Exercice supplémentaire · niveau 2 · NSI (première), chapitre 7 — Parcourir, trier, prouver · Terminaison, échanges, partitions

Énoncé

L'échange t[i], t[m] = t[m], t[i] se passe de variable temporaire. Que se passe-t-il quand i == m ? Et pourquoi la version en deux affectations séparées est-elle fausse ?

Corrigé

Quand i == m : rien, et c'est correct. Python évalue d'abord le membre de droite en un p-uplet (t[m], t[i]), puis affecte. Avec , cela revient à réécrire la case avec sa propre valeur. Sur [3, 1, 4], échanger la case avec elle-même rend [3, 1, 4]. Aucun cas particulier à écrire — et c'est heureux, parce que le tri par sélection fait cet échange nul à chaque fois que le minimum est déjà en place.

La version fausse.


t[i] = t[m]        # on ECRASE t[i] avant de l'avoir sauvegarde
t[m] = t[i]        # ... et t[i] vaut deja t[m] : les deux cases sont egales

Sur [3, 1, 4] avec et , on obtient [4, 1, 4] : le a disparu, le est en double. C'est la même faute que le tri_faux de la banque d'entraînement — le tableau reste de la bonne longueur, mais son contenu est détruit.

La correction, en trois lignes. Il faut une variable temporaire :


temp = t[i]
t[i] = t[m]
t[m] = temp

L'affectation simultanée de Python fait exactement cela, en une ligne et sans nommer la variable.

Validation : sur tirages, avec et tirés indépendamment — donc parfois égaux — l'affectation simultanée donne toujours le résultat attendu.

Le vrai enseignement. L'ordre d'évaluation n'est pas un détail de syntaxe : il décide de la correction. « Sauvegarder avant d'écraser » est la règle générale, et l'affectation simultanée n'est qu'une façon commode de ne jamais l'oublier.

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.