miércoles, 13 de marzo de 2013

Permutaciones


No me lo hubiera creído. Está nevando. Y a estas alturas. Mediados de Marzo. O sea que esta vez acertaron: A partir de 200 metros. Sí, señor, aquí estamos a 240, más o menos.
Hablando de todo un poco, sigo con mis programas en C++ - gran entretenimiento, más aun cuando se combina la programación con las matemáticas -. El último programa, que pongo ahí arriba tiene por objeto obtener todas las permutaciones de cuatro elementos. Está hecho a puro pulso, sin mirar un libro. Es curioso cómo trabaja la mente humana. Es lo que más me llamó la atención mientras lo hacía. Una vez hecho, todo te parece lógico y sencillo, pero las vueltas que has dado y lo que has apretado el coco mientras lo hacías es todo un tema. Es lo que pasa con los teoremas y las demostraciones que admiramos en los libros; puedes tardar un cierto tiempo en comprenderlos, pero no pensamos en lo que le costó al que los encontró por primera vez. Solemos atribuir estos logros al "genio", pero esto no es exactamente así. Más que al genio hemos de atribuirlo al empeño. "El genio es una larguísima paciencia". También es verdad que las soluciones no suelen venir mientras estamos de codos en la mesa pensando sobre ello, sino mientras paseamos, nos afeitamos, o nos tumbamos en la cama con los ojos abiertos mirando al techo. Leí en una ocasión cómo se le ocurrió a Descartes lo de las coordenadas que llevan su nombre y que hicieron posible la Geometría Analítica. Descartes solía quedarse en la cama por las mañanas largo rato pensando - nunca fue gran madrugador, excepto cuando lo obligó la reina Cristina de Suecia, que tenía su clase a las 6 de la mañana -. Pues bien, en una ocasión en la habitación, se supone que en verano, cosa harto frecuente, estaba una mosca trazando círculos y más círculos en el aire; Descartes empezó a pensar cómo se podría "describir" el movimiento de la mosca, un movimiento que resultaba más o menos regular, pero no sencillamente circular, quizás en algunos casos rectilíneo y en otros elíptico... Entonces se le ocurrió lo de determinar en cada momento su posición por la distancia a las paredes y al techo - o al suelo -. Esto hoy día nos parece elemental, pero antes de Descartes a nadie se le había ocurrido.
En muchos problemas de lo que se trata es de encontrar la razón de una serie de números. Es decir, cómo se pueden obtener mediante un ciclo, por ejemplo, o mediante alguna fórmula o algoritmo. Una cosa que encontré, por ejemplo, es la forma de obtener permutaciones cíclicas mediante los restos de una división. Es lo que se llama "a-módulo-b", en C "a%b". Si nos fijamos en la línea 30 del programa yo quiero obtener 2, 1, 2, 1, 2 ... Dividiendo k, que crece hacia 6, por 2: 1/2, 2/2, 3/2, 4/2, 5/2, ... obtengo 1, 0, 1, 0, 1,... y añádiéndole 1: 2, 1, 2, 1, 2,... Esto se hace para hacer las sustituciones de letras h=a[2],...h=a[1],.. alternativamente. 'h' es una variable de "reposición", algo que se utiliza siempre que queremos hacer sustituciones.
Bueno, pues esto a propósito de la nieve.
Para copiar y pegar:

#include<iostream>
using namespace std;
char a[4];
int main(){
int i;
char r;
char permuta();
a[0]='A';a[1]='B';a[2]='C';a[3]='D';
cout<<endl;
//**CUERPO PRINCIPAL**
permuta();
for(i=1;i<4;i++){
cout<<endl;
r=a[0]; a[0]=a[i]; a[i]=r; //sustitución de la primera letra
permuta();
}
cout<<endl;
return 0;
}
//**FUNCION PERMUTADORA**
char permuta(){
int p,q,k=0;
char h;
for(p=0;p<6;p++){
for(q=0;q<4;q++) //escribe las letras siempre en el orden 0-1-2-3
cout<<a[q];
if(k==6) break;
k++;
cout<<"  ";
h=a[(k%2)+1]; a[(k%2)+1]=a[3]; a[3]=h; //permutación de las tres letras restantes
}
}

No hay comentarios:

Publicar un comentario en la entrada