Envoyé par
pseudocode
ou, moins cryptique (quoique)
Non pas vraiment, c'est juste de la récursion simple (avec une petite astuce pour la mémoire constante), oublions temporairement /\/ et remplaçons le par ++, l'opérateur classique de concaténation de liste.
1 2 3 4
| powerset :: [a] -> [[a]]
powerset [] = [[]]
powerset (x:xs) = xss ++ map (x:) xss
where xss = powerset xs |
- Cas de base : powerset de l'ensemble vide est l'ensemble contenant l'ensemble vide.
- Récursion sur une liste de tête x et de queue xs : il y a les parties qui ne contiennent pas x (powerset xs) et les parties qui contiennent x (tous les éléments de (powerset xs) à qui on ajoute x).
- Vérification de la récursion : chaque appel récursif se fait avec une liste de longueur strictement inférieure à la liste initiale, le cas de base nous assure que la récursion s'arrêtera.
L'opérateur /\/ qu'on définit ensuite permet d'alterner entre élément de son premier argument et élément de son second argument, par exemple :
[1,2,3] /\/ [4, 5] == [1,4,2,5,3]
L'évaluation paresseuse fait le reste, et cette solution s'exécute en mémoire constante.
--
Jedaï
Partager