Voce pode fazer com que cada número gere todas as opções a partir dele, e chamar uma recursão para embaralhar a próxima fase até ter apenas 1 valor na ArrayList!
Ex:
ArrayList(“10”,“20”,“30”,“40”)
10, 20, 30, 40
10, 20, 40, 30
10, 30, 20, 40
10, 30, 40, 20
10, 40, 20, 30
10, 40, 30, 20
Primeiro as repeticoes com 10 fixo, dai concatena com segundo fica 1020, e mistura as proximas opcoes, depois 1030, mistura, 1040, mistura, dai muda para o segundo 20 fixo, 2010, mistura… e assim sucessivamente
misturar(fixo, array) - function recursao
10, 20, 30, 40 - inicio
10 - 20, 30, 40 - Fixa o 10, remove ele da lista e repassa para a recursão (10, array[“20”,“30”,“40”])
1020 - 30,40 - Fixa o 20, remove ele da lista e repassa para a recursão (1020, array[“30”,“40”])
102030 - 40 - Fixa o 30, remove ele da lista e repassa para a recursão (102030, array[“40”])
Agora so tem 1 numero na array, imprime ele (10203040) e retorna para a funcao anterior
102040 - 30 - Fixa o 40, remove ele da lista e repassa para a recursao (102040, array[“30”])
Agora so tem 1 numero na array, imprime ele (10204030) e retorna para a funcao anterior
Ultimo item da lista retorna para a funcao anterior
1030 - 20, 40 - Fixa o 30, remove ele da lista e repassa para a recursão (1030, array[“20”, “40”])
continue…
a recursao funcionaria com 1 if e 1 else:
O primeiro seria, se o tamanho da lista for maior do que 1 (isso geraria um for para cada item da array e para cada iteracao chamaria a recursao)
Caso contrario, printa a concatenacao do “fixo”+array[0]
Entendeu a ideia?