podes aplicar una tecnica conocida como backtracking para generar todas las secuencias de un tamaño predeterminado posibles entre esos elementos de tu lista...por ejemplo, si tu lista es {1,2,3} y queres saber cuales son todas las secuencias de tamaño 2, estas serian:
<(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1),(3,2),(3,3)>
El pseudo-codigo de un algoritmo para hacer esto seria asi:
// n en el ejemplo anterior seria 2 (tamaño de la secuencia)
Lista L, entero n;
void generar(Secuencia s) {
for(cada elemento l de la lista L)
{
agregar l al final de la secuencia s;
if(s.tamaño() = = n)
imprimir(secuencia s);
else
generar(s);
borrar l del final de la secuencia s;
}
}
Podes seguir lo que va haciendo este algoritmo con un arbol. El nodo raiz seria vacio, despues sus hijos inmediatos serian 1, 2, 3 luego cada uno de esos nodos tendria a su vez 1, 2, 3 como hijos...este algoritmo indirectamente va armando ese arbol luego recorre para atras, armando las secuencias. Parece complicado pero si agarras un lapiz y papel para seguir el algoritmo, vas a ver como va generando la lista.
pd. podes tomar este algoritmo como base para hacer el tuyo, que note que por ejemplo no toma en cuenta todos los subconjuntos posibles (ej. solo muestra {1,2} y no {2,1}, no muestra los subconjuntos formados por si mismos: {1,1}, etc).