2010-12-15 6 views
1

lists:sublist/2 et lists:sublist/3 simplifier l'extraction d'une seule sous-liste d'une liste, mais existe-t-il un BiF ou un module qui renvoie une liste de toutes les sous-listes d'une liste?Diviser une liste Erlang, X, dans une liste de tous les sous-listes X

à savoir

lists:awesome_sublist_function([1,2,3,4]) -> 
    [[1], [2], [3], [4], [1,2], [1,3], [1,4], 
    [2,3], [2,4], [3,4], [1,2,3], [1,2,4], [1,3,4], [2,3,4], [1,2,3,4]] 

peut construire mon propre, mais il se demande si le problème a été résolu avant nulle part?

+0

Non, mais il devrait être assez facile à écrire. On dirait un travail pour les listes: unfold/4 - malheureusement, il n'existe pas encore. – dsmith

Répondre

2

Je suppose que votre cas de test oublie [1,3,4], mais il pourrait ressembler à ceci:

-module(settheory). 
-export([combinations/1]). 

combinations([]) -> 
    []; 
combinations([H | T]) -> 
    CT = combinations(T), 
    [[H]] ++ [[H | L] || L <- CT] ++ CT. 

-include_lib("eunit/include/eunit.hrl"). 
combinations_test() -> 
    ?assertEqual(
     combinations([1,2,3,4]), 
     lists:sort([[1], [2], [3], [4], [1,2], [1,3], [1,4], 
        [2,3], [2,4], [3,4], [1,2,3], [1,2,4], [1,3,4], 
        [2,3,4], [1,2,3,4]])), 
    ok. 
+0

Certainement le travail, merci! (et oui, j'ai manqué [1,3,4] - maintenant ajouté à la question). Je vais m'en aller et penser à une version récursive de la queue. – majelbstoat

+0

Mis à part le plaisir de le faire je ne voudrais pas passer trop de temps à faire cela, La différence d'efficacité ne sera probablement pas beaucoup. – rvirding

+1

Vous avez raison. En termes de vitesse, cela ne fait pas beaucoup de différence, même sur les grandes listes. Pas beaucoup de différence pour la pile non plus - je me demande si c'est parce que le résultat ne sera ajouté que de toute façon. Sur une liste de 24 items, répétée une centaine de fois, une version d'appel de queue avait une médiane plus petite et une gamme plus étroite, mais aucune différence réelle avec la moyenne. (C'était amusant quand même :)). – majelbstoat

Questions connexes