Pessoal, boa tarde.
Alguém já postou aqui no fórum alguma pergunta refere a análise combinatória com letras?
Ex.: o usuário digita uma sequência de letras tipo ABCDEA e o nº de sequencias que ele quer tipo 24 combinações diferentes. É possível fazer um assim e como?
Eu tenho este código
public static void main(String[] args){
String[] arr = {“A”,“B”,“C”,“D”,“E”};
combinations2(arr, 3, 0, new String[5]);
}
static void combinations2(String[] arr, int len, int startPosition, String[] result){
if (len == 0){
System.out.println(Arrays.toString(result));
return;
}
for (int i = startPosition; i <= arr.length-len; i++){
result[result.length - len] = arr[i];
combinations2(arr, len-1, i+1, result);
}
}
Ele gera essas combinações:
[A, B, C]
[A, B, D]
[A, B, E]
[A, C, D]
[A, C, E]
[A, D, E]
[B, C, D]
[B, C, E]
[B, D, E]
[C, D, E]
Eu queria que a partir de um nº digitado pelo usuário, ex.: 12 ele gerasse 12 combinações diferentes.
ABCDEA
AEDCBA
Você pode adicionar um contador, para ir contabilizando as combinações geradas. Fiz essa alteração adicionados mais dois parâmetros (count e total) para a função combination2. Esse algoritmo vai pegar sempre as N primeiras combinações se possível.
import java.util.*;
public class Main {
public static void main(String[] args) {
String[] arr = {"A","B","C","D","E"};
combinations2(arr, 3, 0, new String[3], 4, 0);
}
private static int combinations2(String[] arr, int len,
int startPosition, String[] result, int total, int count)
{
if(count >= total) return count; //finaliza;
if (len == 0){
System.out.println(Arrays.toString(result));
count++; // mais uma combinação
return count;
}
for (int i = startPosition; i <= arr.length-len; i++){
result[result.length - len] = arr[i];
count = combinations2(
arr, len-1, i+1, result,
total, count
);
if(count >= total) return count; // encerra o algoritmo
}
return count;
}
}
Outra solução é criar uma variável global como contador!
Valeu mais uma dúvida. Suponhamos que eu aumente o array [6] e len também para 6 com o mesmo total por que só tenho uma combinação? Para aumentar para 12 combinações por exemplo, seria como?
[B, A, C, D, E, B]
Esse algoritmo faz uma combinação, ou seja combinação de 6 elementos agrupados em 6:
C6,6 = 6! / (!6 • (6 - 6)!) = 6! / (6! • 0!) = 1
Como pode ver só existe uma combinação, talvez o que você tem em mente seja uma permutação!
Essa fórmula: (n-1)!/2 seria permutação?
Eu desconheço essa fórmula. A fórmula de uma permutaçao simple é:
Pn = n!
Se você quer um algoritmo que gere todas as permutacões de uma palavra, tem esse site aqui: