martes, 24 de febrero de 2009

RESOLUCION DE LAS TORRES DE HANOI

El problema de las Torres de Hanói es curiosísimo porque su solución es muy rápida de calcular, pero el número de pasos para resolverlo crece exponencialmente conforme aumenta el número de discos.

Existen otras versiones del problema con un número diferente de varillas. Aunque se conocen algoritmos eficientes que resuelven el problema con 3 varillas de manera óptima, no se han encontrado aún sus contrapartidas para cualquier número (N igual o superior a 3) de ellas.

Otra manera de resolverlo es basándose en el disco más pequeño, en este caso el de hasta arriba. El movimiento inicial de este es hacia la varilla auxiliar. El disco número dos por regla, se debe mover a la varilla número tres. Luego el disco uno se mueve a la varilla tres para que quede sobre el disco dos. A continuación se mueve el disco que sigue de la varilla uno, en este caso el disco número tres, y se coloca en la varilla dos. Finalmente el disco número uno regresa de la varilla tres a la uno (sin pasar por la dos) y así sucesivamente. Es decir, el truco está en el disco más pequeño

LEYENDA SOBRE LAS TORRES DE HANOI

En un templo de Benarés, se encontraba una cúpula que señalaba el centro del mundo. Allí estaba una bandeja sobre la cual existían tres agujas de diamante. En una mañana lluviosa, un rey mandó a poner 64 discos de oro, siendo ordenados por tamaño: el mayor en la base de la bandeja y el menor arriba de todos los discos.

Después de la colocación, los sacerdotes del templo intentaron mover los discos entre las agujas, según las leyes que se les habían entregado: "El sacerdote de turno no debe mover más de un disco a la vez, y no puede situar un disco de mayor diámetro encima de otro de menor diámetro".

Hoy no existe tal templo, pero el juego aún perduró en el tiempo...

Otra leyenda cuenta que Dios al crear el mundo, colocó tres varillas de diamante con 64 discos en la primera. También creó un monasterio con monjes, los cuales tienen la tarea de resolver esta Torre de Hanói divina. El día que estos monjes consigan terminar el juego, el mundo acabará.

No obstante, esta leyenda resultó ser un invento publicitario del creador del juego, el matemático Éduard Lucas. En aquella época, era muy común encontrar matemáticos ganándose la vida de forma itinerante con juegos de su invención, de la misma forma que los juglares hacían con su música. No obstante, la falacia resultó ser tan efectista y tan bonita, que ha perdurado hasta nuestros días. Además, invita a realizarse la pregunta: "si la leyenda fuera cierta, ¿cuándo será el fin del mundo?".

El mínimo número de movimientos que se necesita para resolver este problema es de 264-1. Si los monjes hicieran un movimiento por segundo, los 64 discos estarían en la tercera varilla en algo menos de 585 mil millones de años. Como comparación para ver la magnitud de esta cifra, la Tierra tiene como 5 mil millones de años, y el Universo entre 15 y 20 mil millones de años de antigüedad, sólo una pequeña fracción de esa cifra.

¿QUE SON LAS TORRESDE HANOI?

Las Torres de Hanói es un rompecabezas o juego matemático inventado en 1883 por el matemático francés Éduard Lucas.

Consiste en tres varillas verticales y un número indeterminado de discos que determinarán la complejidad de la solución. No hay dos discos iguales, están colocados de mayor a menor en la primera varilla ascendentemente, y no se puede colocar ningún disco mayor sobre uno menor a él en ningún momento.

El juego consiste en pasar todos los discos a la tercera varilla colocados de mayor a menor ascendentemente.

Las reglas son:

  • Sólo se puede mover un disco cada vez.
  • Un disco de mayor tamaño no puede descansar sobre uno más pequeño que él mismo.
  • Sólo puedes desplazar el disco que se encuentre arriba en cada varilla.

ALGORITMO TORRES DE HANOI

hanoi ( N, origen, destino, auxiliar )
{
si N0
entonces
hanoi(N - 1, origen, auxiliar, destino)
pasar disco N de origen a destino
hanoi(N - 1, auxiliar, destino, origen)
fin-si
}
sea máximo el número de discos total
sea destino el sitio final de máximo
sea disco = máximo

repita

mientras disco > 0 haga

si disco ya está en destino,
o bien, mover disco a destino tiene éxito entonces

si disco = máximo entonces
decremente máximo en 1

si máximo = 0 entonces
termine // solución lista
fin-si

sea destino el sitio final de máximo

fin-si

si_no

sea destino el sitio distinto de destino y del
sitio en donde está disco

fin-si

decremente disco en 1

fin-mientras

sean p y q los sitios distintos de destino
sea disco el menor de los discos de los topes de p y q
sea destino el sitio entre p y q con el mayor tope

fin-repita

}

miércoles, 18 de febrero de 2009

ALGORITMO FACTORIAL DE UN NUMERO

Inicio

var: fact,resp;

principal

Escribir("Digite el número al que desea sacarle el factorial");
Leer(fact);resp=1si(fact=0);
escribir("fact=1");
sino
{
while(fact> o =1)resp=resp*factfact=fact - 1;
}
escribir("la respuesta del factorial es="+resp)

terminar

EL FACTORIAL DE UN NUMERO

import javax.swing.JOptionPane;
class factorial2
{
public static void main(String Args[])
{
/* estas lineas de codigo son la declaracion de las variables
int factorial[] = new int[999999];
int resto=0;
String strnumero;
int intnumero;
int a=1, d=0, f=0;
factorial[0] = 1;
/* aqui le pedimos al usuario el numero que desea el factorial

strnumero = JOptionPane.showInputDialog( "Ingrese el numero" );

/*aqui lo guardamos
intnumero = Integer.parseInt( strnumero );
for(;a<=intnumero;a++) { if(a%500 == 0) System.out.println(a); /*esto es para que el usuario sepa por que nmero va.*/ for(d=0;d<=f;d++) { /*voy recorriendo los indices del array hasta llegar al indice maximo hasta el momento*/ factorial[d] = factorial[d] * a + resto; resto = factorial[d] / 10; /*el factorial se divide entre 10 para que la variable int me elimine el ultimo numero*/ factorial[d] = factorial[d] - (resto*10); /*con esto obtengo el ultimo numero que es el que se quedara en el array*/ } d--; for(;f>=d;)
{
if(resto==0)
{
break;
}
f++;

/*aqui es cuando aumento el indice del array a medida que lo voy necesitando*/

factorial[f] = factorial[f] * a + resto;
resto = factorial[f] / 10;
factorial[f] = factorial[f] - (resto*10);
}
}
System.out.print("El factorial de: "+intnumero+" es: ");
for(d=f+1;f>=0;f--)
{
System.out.print(factorial[f]);
}
System.out.println("\nEste numero tiene: "+d+" cifras");
}
}