03/07/2023
Las permutaciones son un concepto fundamental en matemáticas y ciencias de la computación, vital para entender cómo se pueden organizar elementos de un conjunto. En el ámbito de la programación, y específicamente en C++, calcular y generar permutaciones es una habilidad valiosa que se aplica en diversos problemas, desde la optimización de algoritmos hasta la generación de combinaciones en juegos o la seguridad informática. Este artículo explorará en profundidad qué son las permutaciones, sus fórmulas, y cómo implementarlas eficientemente en C++.

Comprender las permutaciones no solo es útil para resolver problemas matemáticos, sino que también abre la puerta a la resolución de desafíos algorítmicos complejos. Veremos cómo la lógica factorial es la piedra angular de estos cálculos y cómo el lenguaje C++ nos proporciona las herramientas para llevarlos a cabo, ya sea para obtener el número total de arreglos posibles o para listar cada uno de ellos.
- ¿Qué es una Permutación?
- El Concepto de Factorial
- Fórmula para Calcular Permutaciones
- Cálculo de Permutaciones en C++: Un Enfoque Práctico
- Generando Todas las Permutaciones de una Lista o Cadena en C++
- Permutación vs. Combinación: Una Comparación Crucial
- Aplicaciones en el Mundo Real
- Preguntas Frecuentes (FAQ)
- Conclusión
¿Qué es una Permutación?
Una permutación se define como un arreglo de objetos en un orden definido. En términos más sencillos, es una forma específica de organizar un conjunto de elementos donde el orden de los elementos es crucial. Si cambiamos el orden de los elementos, obtenemos una permutación diferente. Por ejemplo, para el conjunto A={1, 6}, las permutaciones posibles son {1, 6} y {6, 1}. No hay otras formas de arreglar estos dos elementos si el orden importa.
A diferencia de las combinaciones, donde el orden no es relevante (por ejemplo, {1, 6} es lo mismo que {6, 1} en una combinación), en las permutaciones cada secuencia única cuenta como un arreglo distinto. Esta distinción es la clave para entender cuándo aplicar permutaciones en lugar de combinaciones.
El Concepto de Factorial
Antes de adentrarnos en la fórmula de las permutaciones, es imperativo entender el concepto de factorial. El factorial de un número entero no negativo 'n', denotado como n!, es el producto de todos los enteros positivos menores o iguales a 'n'. Por definición, 0! es igual a 1 y 1! es igual a 1. Para n > 1, n! se calcula como:
n! = n × (n-1) × (n-2) × ... × 2 × 1
Por ejemplo:
- 3! = 3 × 2 × 1 = 6
- 5! = 5 × 4 × 3 × 2 × 1 = 120
El factorial es fundamental en los cálculos de permutaciones porque representa el número de formas en que 'n' objetos distintos pueden ser ordenados en una secuencia.
Fórmula para Calcular Permutaciones
La fórmula general para calcular el número de permutaciones de 'n' objetos tomados 'r' a la vez (donde el orden importa y no hay repetición) se denota comúnmente como P(n,r), nPr, o Pnr. La fórmula es la siguiente:
P(n,r) = n! / (n-r)!
Donde:
- 'n' es el número total de elementos disponibles.
- 'r' es el número de elementos que se seleccionarán y ordenarán.
Por ejemplo, si queremos saber de cuántas maneras se pueden otorgar el 3er y 4to puesto en una carrera con 10 participantes (es decir, seleccionar 2 puestos de 10 participantes, donde el orden importa):
P(10, 2) = 10! / (10-2)!
P(10, 2) = 10! / 8!
P(10, 2) = (10 × 9 × 8!) / 8!
P(10, 2) = 10 × 9 = 90
Esto significa que hay 90 maneras diferentes de otorgar el 3er y 4to puesto a 10 participantes.
Tipos de Permutaciones
Las permutaciones se pueden clasificar en diferentes categorías según las condiciones de los objetos y la repetición:
1. Permutación de 'n' Objetos Distintos (Sin Repetición)
Este es el caso más común y el que cubre la fórmula P(n,r) = n! / (n-r)!. Aquí, cada objeto es único y una vez que se selecciona un objeto, no se puede volver a seleccionar. El número de opciones disminuye con cada selección. El ejemplo de la palabra SWING ilustra esto:
¿Cuántas palabras de 3 letras (con o sin significado) se pueden formar con las letras de la palabra SWING si no se permite la repetición de letras?
Aquí, n = 5 (letras en SWING) y r = 3 (letras a elegir).

P(5, 3) = 5! / (5-3)! = 5! / 2!
P(5, 3) = (5 × 4 × 3 × 2 × 1) / (2 × 1) = 60
Hay 60 palabras posibles.
2. Permutación con Repetición Permitida
Cuando la repetición de objetos está permitida, el número de opciones no disminuye con cada selección. Si tenemos 'n' objetos y queremos seleccionar 'r' de ellos con repetición, la fórmula es simplemente:
nr
Por ejemplo, ¿cuántas palabras de 3 letras (con o sin significado) se pueden formar con las letras de la palabra SMOKE si se permite la repetición de letras?
Aquí, n = 5 (letras en SMOKE) y r = 3 (letras a elegir).
Permutación (con repetición) = 53 = 5 × 5 × 5 = 125
Hay 125 palabras posibles.
3. Permutación de Multiconjuntos (Objetos no Distintos)
Este tipo de permutación se aplica cuando tenemos un conjunto de 'n' objetos donde algunos de ellos son idénticos entre sí. Si hay p1 objetos de un tipo, p2 objetos de un segundo tipo, y así sucesivamente hasta pk objetos de un k-ésimo tipo, donde p1 + p2 + ... + pk = n, la fórmula es:
n! / (p1! × p2! × ... × pk!)
Esta fórmula ajusta el total de permutaciones para evitar contar múltiples veces los arreglos que son idénticos debido a la presencia de elementos repetidos.
Cálculo de Permutaciones en C++: Un Enfoque Práctico
El siguiente código en C++ demuestra cómo calcular el número de combinaciones y permutaciones utilizando la función factorial. Este enfoque es directo y utiliza la definición matemática de ambas operaciones.
#include <iostream>
using namespace std;
int fact(int val) {
if (val == 0 || val == 1)
return 1;
else
return val * fact(val - 1);
}
int main() {
int n, r, combination, permutation;
cout << "Enter value of n: ";
cin >> n;
cout << "Enter value of r: ";
cin >> r;
// Calculo de la combinacion
combination = fact(n) / (fact(r) * fact(n - r));
// Calculo de la permutacion
permutation = fact(n) / fact(n - r);
cout << " Combination: " << combination << endl;
cout << "Permutation: " << permutation;
return 0;
}Análisis del Código
Este programa se divide en dos partes principales: una función para calcular el factorial y la función principal que realiza los cálculos de permutación y combinación.
La Función fact(int val)
Esta función es responsable de calcular el factorial de un número entero dado. Utiliza un enfoque recursivo, lo que significa que la función se llama a sí misma para resolver subproblemas más pequeños hasta que alcanza una condición base. La lógica es la siguiente:
- Condición Base: Si el valor de
vales 0 o 1, la función retorna 1. Esto es crucial porque 0! = 1 y 1! = 1, y estas son las condiciones que detienen la recursión. - Paso Recursivo: Si
vales mayor que 1, la función retornavalmultiplicado por el factorial deval - 1. Por ejemplo,fact(5)llamará afact(4), que a su vez llamará afact(3), y así sucesivamente hastafact(1). Los resultados se multiplicarán de vuelta para obtener el factorial final.
La recursión es una forma elegante y compacta de implementar el cálculo factorial, reflejando directamente su definición matemática.

La Función main()
La función main() es el punto de entrada del programa. Aquí se solicitan al usuario los valores de 'n' y 'r', que son fundamentales para los cálculos.
- Entrada de Datos: El programa solicita al usuario que ingrese los valores de 'n' (el número total de elementos) y 'r' (el número de elementos a seleccionar).
- Cálculo de la Combinación: Aunque el foco de este artículo son las permutaciones, el código también calcula las combinaciones. La fórmula utilizada es
fact(n) / (fact(r) * fact(n - r)), que es la fórmula estándar para combinaciones (donde el orden no importa). - Cálculo de la Permutación: La línea
permutation = fact(n) / fact(n - r);implementa directamente la fórmula P(n,r) = n! / (n-r)! utilizando la funciónfact()que hemos definido. - Salida de Resultados: Finalmente, el programa imprime los resultados de la combinación y la permutación en la consola.
Ejemplo de Ejecución:
Enter value of n: 9
Enter value of r: 6
Combination: 84
Permutation: 60480En este ejemplo, para n=9 y r=6, el número de permutaciones posibles es 60480. Esto significa que hay 60480 formas diferentes de organizar 6 elementos de un conjunto de 9, donde el orden de los elementos seleccionados es distinto.
Generando Todas las Permutaciones de una Lista o Cadena en C++
Es importante distinguir entre calcular el *número* de permutaciones (como lo hace el código anterior) y *generar* todas las permutaciones posibles. Para generar todas las permutaciones de una lista o cadena en C++, la forma más común y eficiente es utilizar la función std::next_permutation de la Biblioteca Estándar de C++ (STL).
std::next_permutation es una función algorítmica que reordena los elementos de un rango (como un vector o una cadena) a la siguiente permutación lexicográfica (en orden alfabético/numérico). Para que funcione correctamente y genere todas las permutaciones, el rango inicial debe estar ordenado.
Alternativamente, se puede implementar un algoritmo recursivo de backtracking. Este enfoque implica construir las permutaciones paso a paso. Se elige un elemento para la primera posición, luego se llama recursivamente a la función para elegir un elemento para la segunda posición de los restantes, y así sucesivamente. Una vez que se construye una permutación completa, se almacena y la función "retrocede" (backtrack) para probar otras opciones, explorando todas las ramas del "árbol de decisión". Este método es más complejo de implementar manualmente pero ofrece una comprensión profunda de cómo se generan las permutaciones.
Permutación vs. Combinación: Una Comparación Crucial
Aunque a menudo se mencionan juntas, las permutaciones y combinaciones son conceptos distintos con aplicaciones diferentes. La tabla a continuación resume sus principales diferencias:
| Característica | Permutación | Combinación |
|---|---|---|
| Definición | Selección de objetos donde el orden de selección importa. Es un arreglo de 'r' objetos tomados de 'n' objetos. | Selección de objetos donde el orden de selección no importa. Es una selección de 'r' objetos tomados de 'n' objetos. |
| Énfasis | El arreglo y la secuencia son esenciales. | La selección o el grupo son esenciales. |
| Fórmula | P(n,r) = n! / (n-r)! | C(n,r) = n! / [r!(n-r)!] |
| Ejemplo | Formar números con dígitos (ej. 123 es diferente de 321). | Elegir un equipo de personas (ej. {Juan, Pedro} es lo mismo que {Pedro, Juan}). |
La distinción principal radica en si el orden de los elementos seleccionados es significativo o no. Si el orden crea un resultado único, estamos hablando de permutaciones. Si el orden no cambia el resultado, nos referimos a combinaciones.
Aplicaciones en el Mundo Real
Las permutaciones tienen una amplia gama de aplicaciones prácticas en diversas áreas:
- Horarios y Agendas: La planificación de horarios de trenes, autobuses, vuelos o incluso turnos de trabajo a menudo implica calcular el número de posibles arreglos para optimizar la conveniencia pública o la eficiencia operativa.
- Matrículas de Vehículos y Códigos: La creación de códigos únicos para matrículas de vehículos, números de serie o contraseñas se basa en el principio de las permutaciones para asegurar una cantidad suficiente de combinaciones únicas.
- Criptografía: En la seguridad informática, las permutaciones son fundamentales para el diseño de algoritmos de cifrado y descifrado, donde el orden de los bits o caracteres es crucial para la seguridad de los datos.
- Algoritmos y Estructuras de Datos: En la ciencia de la computación, las permutaciones se utilizan en algoritmos de clasificación, búsqueda y para resolver problemas como el "Problema del Viajante de Comercio", donde se deben encontrar rutas óptimas.
- Juegos y Apuestas: En juegos de azar o rompecabezas como el cubo de Rubik, el número de estados posibles o la secuencia de movimientos a menudo se calcula utilizando permutaciones.
Estas aplicaciones demuestran que las permutaciones no son solo un concepto matemático abstracto, sino una herramienta poderosa con impacto en nuestra vida diaria y en el desarrollo tecnológico.

Preguntas Frecuentes (FAQ)
¿Qué es una permutación y cuándo se utiliza?
Una permutación es un arreglo ordenado de elementos de un conjunto. Se utiliza cuando el orden de los elementos es importante, por ejemplo, para calcular cuántas maneras hay de organizar personas en una fila, o cuántos códigos de seguridad se pueden formar con ciertos caracteres.
¿Cuál es la fórmula para calcular el número de permutaciones?
La fórmula para calcular el número de permutaciones de 'n' objetos tomados 'r' a la vez sin repetición es P(n,r) = n! / (n-r)!. Si se permite la repetición, la fórmula es nr.
¿Cómo se calcula el factorial de un número en C++?
El factorial se puede calcular en C++ usando una función recursiva o un bucle. La función recursiva es común y elegante: si el número es 0 o 1, retorna 1; de lo contrario, retorna el número multiplicado por el factorial del número menos uno.
¿Cuál es la diferencia principal entre permutación y combinación?
La diferencia principal es que en las permutaciones el orden importa, mientras que en las combinaciones el orden no importa. Por ejemplo, {A, B} y {B, A} son permutaciones diferentes, pero la misma combinación.
¿Cómo puedo generar todas las permutaciones de una lista o cadena en C++?
Para generar todas las permutaciones, puedes usar la función std::next_permutation de la Biblioteca Estándar de C++, la cual reordena una secuencia a la siguiente permutación lexicográfica. Alternativamente, se puede implementar un algoritmo recursivo de backtracking.
Conclusión
El cálculo de permutaciones, ya sea para obtener su número total o para generar cada una de ellas, es una habilidad esencial en el ámbito de la computación y las matemáticas. Hemos explorado la definición de permutación, la importancia del factorial, las distintas fórmulas según el tipo de permutación y, crucialmente, cómo implementar estos cálculos en C++. El código proporcionado es un claro ejemplo de cómo las matemáticas se traducen en lógica programable, permitiendo resolver problemas complejos de manera eficiente. Comprender las permutaciones no solo fortalece tus bases matemáticas, sino que también te equipa con una herramienta poderosa para abordar desafíos en algoritmia, seguridad y muchas otras áreas de la ingeniería y la ciencia.
Si quieres conocer otros artículos parecidos a Permutaciones en C++: Concepto y Cálculo puedes visitar la categoría Cálculos.
