[Resolvido] Permutar numeros ('Anagramas')

Olá pessoal. Gostaria de saber de alguma forma de permutar uma lista de numeros.

Exemplo: tenho os numeros 10, 20 e 30

o resultado deve ser:

  • 102030
  • 103020
  • 201030
  • 203010
  • 301020
  • 302010

encontrei uns códigos de anagramas que até certo ponto foram uteis. Porém não consegui fazer algo para tratar “10” como algo atomico. Não quero que o código separe o 1 do 0.

Obs.: Os numeros citado são apenas exemplos podendo ter até 10 numeros diferentes.
como 11, 54, 857, 219, etc…

Não estou pedindo pra vc’s fazerem meu trabalho, nem código. Quero apenas idéias e dicas pra saber qual melhor caminho. Se tiver um código. Mesmo que seja pseudo código melhor. Grato.

adicione os numeros em variaveis, ai vc manipula elas

Ex:
int x = 10;
int y = 20;
int z = 30;

xyz
xzy
y…

então. Minha duvida é exatamente como fazer para manipular essas variáveis.

pois se eu tenho int[1], int[2], int[3] é equivalente à int x, int y, int z.

Obrigado pela ajuda. Se tiver alguma ideia sobre como fazer essa manipulação.

OBS.: Acho que é mais simples tratar os numeros como String’s neste caso pois não nos preocupamos com potencia.

No caso se eu quiser a partir de 1 e 2 chegar em 12 e 21

Com int: algo como 110 + 2 e 210 + 1

Com String “1” + “2” = “12” e “2” + “1” = “21”

Voce poderia fazer uma ArrayList (String melhor para concatenar do jeito que vc quer) e utilizar uma função recursiva.

[quote=tgcmv]Olá pessoal. Gostaria de saber de alguma forma de permutar uma lista de numeros.

Exemplo: tenho os numeros 10, 20 e 30

o resultado deve ser:

  • 102030
  • 103020
  • 201030
  • 203010
  • 301020
  • 302010

encontrei uns códigos de anagramas que até certo ponto foram uteis. Porém não consegui fazer algo para tratar “10” como algo atomico. Não quero que o código separe o 1 do 0.

Obs.: Os numeros citado são apenas exemplos podendo ter até 10 numeros diferentes.
como 11, 54, 857, 219, etc…

Não estou pedindo pra vc’s fazerem meu trabalho, nem código. Quero apenas idéias e dicas pra saber qual melhor caminho. Se tiver um código. Mesmo que seja pseudo código melhor. Grato.[/quote]

Você sabe quantos números vai ter na entrada? Tipo, sempre vai ser 3 entradas? Ou isso também é aleatório?

No máximo 10 entradas. Que vão gerar 3.628.800 de resultados. Para facilitar pode considrar que são sempre 10 entradas (isso já resolveria meu problema).

Já estou usando list. Agora não sei como farei essa função recursiva.

Obrigado a todos pela ajuda. Aguardando mais respostas.

Um exemplo de recursao utilizando a função fatorial, que multiplica por cada retorno o valor do numero anterior, ele vai entrando na função fatorial (ele mesmo) até encontrar o número 1.

Ex de fatoriais:
fatorial(2) = 2X1 = 2
fatorial(3) = 3X2X1 = 6
fatorial(4) = 4X3X2X1 = 24
fatorial(5) = 5X4X3X2X1 = 120

[code]

public class Recursao {

public int fatorial(int numero) {
	if (numero>1)
		return fatorial(numero-1)*numero;
	else
		return 1;
}

public static void main(String[] args) {
	Recursao recursao = new Recursao();
	System.out.println(recursao.fatorial(5));
}

}[/code]

Okay. Tenho um exemplo de recursão. Obrigado.
Mas… Como gerar os numeros? alguma idéia de algoritmo?

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?

entendi. parecido com uns códigos que tinha visto. Obrigado.
Embora vá adiar essa implementação por um tempinho entendi como fazer. Obrigado mais uma vez. :smiley:

É nózes!! Qualquer dúvida avisa aew ^^