La complexité d'un enchaînement de tests
Exercice supplémentaire · niveau 3 (difficile) · sciences numériques et technologie (seconde), chapitre 3 — Instructions conditionnelles · Indentation et conditions imbriquées
Énoncé
Comparer ces deux fonctions qui déterminent si un entier est divisible par , par , par les deux ou par aucun. Combien de tests chacune effectue-t-elle au pire ? Laquelle préférer, et pourquoi ?
def version_A(n):
if n % 2 == 0 and n % 3 == 0: return "les deux"
if n % 2 == 0 and n % 3 != 0: return "2 seulement"
if n % 2 != 0 and n % 3 == 0: return "3 seulement"
return "aucun"
def version_B(n):
if n % 2 == 0:
return "les deux" if n % 3 == 0 else "2 seulement"
else:
return "3 seulement" if n % 3 == 0 else "aucun"Corrigé
Les deux fonctions donnent les mêmes résultats.
Version A : jusqu'à six calculs de reste au pire (trois lignes de deux tests), et surtout chaque reste est recalculé plusieurs fois. Version B : exactement deux, quel que soit n.
Au-delà du décompte, la version B a un avantage plus solide : sa structure garantit que les quatre cas sont exclusifs et exhaustifs. Dans la version A, rien n'empêche d'écrire deux conditions se recouvrant, ou d'en oublier une — le return "aucun" final ramasserait silencieusement les cas non prévus.
C'est l'argument principal : une structure arborescente rend l'exhaustivité visible, une liste de tests indépendants la laisse à la vigilance de celui qui écrit.
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.