Se *tiene* que hacer con recursividad.Las soluciones anteriores que usan ciclos...
A ver, sea como sea que quieras hacerlo, con importancia del orden, sin importancia del orden, con repeticion, sin repetición, todo se reduce a:
1) Tienes ya una parte de la solución : (inicialmente, está vacía)
2) Tienes una serie de elementos que puedes añadir a la solución actual (dependiendo del orden/repeticion,etc) : inicialmente, todos los elementos.
La función recursiva es:
1) Si la solución actual tiene la longitud deseada, devolverla.
2) Por cada uno de los elementos que podemos usar para generar nuevas soluciones:
-2.1 crear una nueva solución como la actual + elemento.
-2.2 determinar cuales, de la lista de elementos, son válidos para añadir a nuevas soluciones.
-2.3 llamar recursivamente, con la solucion de 2.1, y la lista de 2.2
Código PHP:
Ver originalSecuencia para [a,b,c,d] :
LLamada inicial: [],[a,b,c,d]
(Bucle)
2.1 : [a]
2.2 [b,c,d]
2.3 LLamada recursiva [a],[b,c,d]
2.1 [a,b]
2.2 [c,d]
2.3 LLamada recursiva [a,b],[c,d]
<retorno: longitud=2>
2.1 [a,c]
2.2 [d]
2.3 LLamada recursiva [a,c],[d]
<retorno: longitud = 2 >
2.1 [a,d]
2.2 []....
2.1 [b]
2.2 [c,d]
2.3 LLamada recursiva [b],[c,d]
.....
2.1 [c]
2.2 [d]
2.3 LLamada recursiva [c],[d]
....
Obviamente, la comprobación de la longitud de la solución se puede hacer antes de llamar a la función recursiva, pero es menos "purista"