Permutação e combinação com JavaScript
Neste artigo aprenderemos como gerar permutações e combinações usando JavaScript.
Permutações
As permutações são uma organização ou rearranjo de todos os elementos de um conjunto em todas as ordens possíveis. Por exemplo, dados os elementos [1, 2, 3], suas permutações são:
[1, 2, 3]
[1, 3, 2]
[2, 1, 3]
[2, 3, 1]
[3, 1, 2]
[3, 2, 1]
Aqui está um exemplo de como implementar a permutação em JavaScript
function gerarPermutacoes(lista) {
const resultados = [];
function retroceder(caminho, opcoes) {
if (caminho.length === lista.length) {
resultados.push([...caminho]);
return;
}
for (let i = 0; i < opcoes.length; i++) {
caminho.push(opcoes[i]);
retroceder(caminho, opcoes.slice(0, i).concat(opcoes.slice(i + 1)));
caminho.pop();
}
}
retroceder([], lista);
return resultados;
}
const numeros = [1, 2, 3];
const permutacoes = gerarPermutacoes(numeros);
console.log("Permutações:", permutacoes);
A função gerarPermutacoes() recebe como parâmetro um array e a partir dele gera todas as permutações possíveis. Perceba que dentro dela existe uma função chamada retroceder, que trabalha de forma recursiva, construíndo as perguntações. Ela recebe dois parãmetros, que são o caminho (Mantém a permutação atual sendo criada) e opcoes (Contém os elementos que ainda podem ser adicionados à permutação)
Quando o tamanho de caminho é igual ao tamanho do array original, uma permutação completa foi formada e é adicionada a resultados. O loop tenta todas as combinações removendo um elemento de opcoes e adicionando-o a caminho.
Ao executar o código, o resultado será:
[
[1, 2, 3],
[1, 3, 2],
[2, 1, 3],
[2, 3, 1],
[3, 1, 2],
[3, 2, 1]
]
Um exemplo de permutação prático seria um gerador de senhas. Com base numa lista de caracteres e num tamanho desejado, ele geraria uma senha aleatória. O código a seguir mostra isso, ao gerar uma senha aleatória com 8 caracteres.
function gerarSenha(tamanho) {
const caracteres = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()";
let senha = "";
for (let i = 0; i < tamanho; i++) {
const indiceAleatorio = Math.floor(Math.random() * caracteres.length);
senha += caracteres[indiceAleatorio];
}
return senha;
}
const tamanhoSenha = 8;
const senhaGerada = gerarSenha(tamanhoSenha);
console.log("Senha gerada:", senhaGerada);
Combinações
Quando lidamos com combinações, estamos interessados em como selecionar um grupo de itens a partir de um conjunto maior, sem importar a ordem. Em JavaScript, podemos usar algumas abordagens simples para calcular as combinações de um conjunto.
Se temos um conjunto de 3 letras, A, B e C, e queremos formar grupos de 2 letras, as combinações possíveis seriam:
AB
AC
BC
Perceba que ao contrário das permutações, a ordem não importa. Ou seja, AB é a mesma coisa que BA.
Aqui está uma função em JavaScript que calcula as combinações de um conjunto de elementos:
function fatorial(n) {
if (n === 0 || n === 1) {
return 1;
}
let resultado = 1;
for (let i = 2; i <= n; i++) {
resultado *= i;
}
return resultado;
}
function combinacoes(n, r) {
return fatorial(n) / (fatorial(r) * fatorial(n - r));
}
console.log(combinacoes(3, 2));
Veja que a nossa função combinacoes utiliza uma função auxiliar chamada fatorial para calcular o resultado. O fatorial de um número é o resultado da multiplicação de todos os números inteiros de 1 até esse número. Ele é muito usado em problemas de combinatória, como o cálculo de permutações e combinações. A notação usada para fatorial é o símbolo de exclamação (!).
Por exemplo, o fatorial de 4, escrito como 4!, seria:
4! = 4 × 3 × 2 × 1 = 24
O fatorial cresce rapidamente à medida que o número aumenta.