Adloun

Les sous-listes d'une somme donnée

Exercice · informatique (tronc commun des prépas scientifiques), chapitre 6 — Fonctions récursives

Énoncé

Écrire sommes_possibles(t, cible) renvoyant la liste de toutes les sous-listes de t dont la somme vaut cible. En déduire une fonction existe_somme(t, cible) renvoyant un booléen et s'arrêtant dès la première solution trouvée.

Corrigé

def sommes_possibles(t: list, cible: float) -> list:
    if t == []:
        return [[]] if cible == 0 else []
    sans = sommes_possibles(t[1:], cible)
    avec = [[t[0]] + s for s in sommes_possibles(t[1:], cible - t[0])]
    return sans + avec

def existe_somme(t: list, cible: float) -> bool:
    if t == []:
        return cible == 0
    return (existe_somme(t[1:], cible)
            or existe_somme(t[1:], cible - t[0]))

La version booléenne tire profit du court-circuit de l'opérateur or : dès qu'un chemin renvoie True, les autres branches de l'arbre combinatoire ne sont pas explorées. La complexité dans le pire des cas reste toutefois exponentielle en .

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.