Adloun

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.