sábado, 28 de febrero de 2009

TORRES DE HANOI

Las Torres de Hanói es un rompecabezas o juego matematico inventado en 1883 por el matematico frances Eduard 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.
Iterativo
Otra manera de resolver el problema, sin utilizar la recursividad, se basa en el hecho de que para obtener la solución más corta, es necesario mover el disco más pequeño en todos los pasos impares, mientras que en los pasos pares sólo existe un movimiento posible que no lo incluye. El problema se reduce a decidir en cada paso impar a cuál de las dos pilas posibles se desplazará el disco pequeño:
El algoritmo en cuestión depende del número de discos del problema.
Si inicialmente se tiene un número impar de discos, el primer movimiento debe ser colocar el disco más pequeño en la pila destino, y en cada paso impar se le mueve a la siguiente pila a su izquierda (o a la pila destino, si está en la pila origen). La secuencia será DESTINO, AUXILIAR, ORIGEN, DESTINO, AUXILIAR, ORIGEN, etc. Si se tiene inicialmente un número par de discos, el primer movimiento debe ser colocar el disco más pequeño en la pila auxiliar, y en cada paso impar se le mueve a la siguiente pila a su derecha (o a la pila origen, si está en la pila destino). La secuencia será AUXILIAR, DESTINO, ORIGEN, AUXILIAR, DESTINO, ORIGEN, etc.

Torres de Hanoi en C

#include
int count = 0;
int moverdisco(int a, int b)
{
cout << a << "->" << b << endl; count++;
}
int movertorre(int n, int desde, int hacia, int piv)
{
if(n < 2) moverdisco(desde,hacia);
else {
movertorre(n-1,desde,piv,hacia);
moverdisco(desde,hacia);
movertorre(n-1,piv,hacia,desde);
}
return 0;
}
int main()
{
int discos = 7;
cout << "Las Torres de Hanoi\n";
cout << "resolviendo para " << discos << " discos\n\n";
movertorre(discos,1,3,2);
cout << "\nResuelto en " << count << " movimiento(s)\n\n";
return 0;
}

viernes, 27 de febrero de 2009

SUCESION FIBONACCI

En matemáticas, la sucesión de Fibonacci es la siguiente sucesión infinita de números naturales:
0 , 1 , 1, 2 , 3 , 5 , 8 , 13 , 21 , ...
El primer elemento es 0, el segundo es 1 y cada elemento restante es la suma de los dos anteriores. A cada elemento de esta sucesión se le llama número de Fibonacci.

Recursivamente

f(0) = 0

f(1) = 1

f(n) = f(n-1) + f(n-2) si n>2

Ejemplo

f(2) = f(2-1) + f(2-2) = f(1) + f(0) = 1 + 0 = 1

f(3) = f(3-1) + f(3-2) = f(2) + f(1) = 1 + 1 = 2

f(4) = f(4-1) + f(4-2) = f(3) + f(2) = 2 + 1 = 3

..................................................................................................

Implementacion

Algoritmo

int fibonacci, i , numero, numero1, numero2;

Inicio

{

imprimir "Digite el numero al que desea calcular la sucesion fibonacci:"

Lea numero

fibonacci = 0

si numero = 0{

imprimir "La serie fibonacci es o"

}

si numero = 1{

imprimir "La serie fibonacci es 1"

sino

{

numero1 = 0

numero2 = 1

para (i = 2 ; i <= numero ; i = i + 1)

{

fibonacci = numero1 + numero2

numero1 = numero2

numero2= fibonacci

imprimir "La serie fibonacci es:", fibonacci

}

}

Fin

..........................................................................................

Codigo en Java

class Fibonacci

{
public static void main (String[]args)
{
int ab=0, a1=1;
System.out.println(a1);
while(a1<1000)


{
System.out.println(a1+"+"+ab+"="+(a1+ab));
a1=a1+ab;
ab=a1-ab;
}
}
}

FACTORIAL

Para todo numero natual n, se llama n factorial o factorial de n al producto de todos los naturales desde 1 hasta n:
n! = 1 x 2 x 3 x 4 x … x (n-1) x n
Recursivamente
f(n) = n * f(n-1) n > 1
ejemplo
f(1) = 1
f(2) = 2 * f(2-1) = 2 * f(1) = 2 * 1 = 2
f(3) = 3 * f(3-1) = 3 * f(2) = 3 * 2 = 6
........................................................................................................
Implementacion
Algoritmo
int factorial, i ;
Inicio
imprimir "Digite el numero al que desea calcular su factorial:"
Lea numero
factorial = 1
para (i = 1 ; i <= numero ; i = i + 1)
{
factorial = factorial * i
}
imprimir "El factorial es:" factorial
Fin
....................................................................................................
Codigo con Java
public class Factoriales
{
static long factorial(int v)

{
if (v>1)
return(v*factorial(v-1));
return(1);
}
public static void main(String[] args)

{
int k;
for (k=1;k<=10;k++) System.out.println(factorial(k));

}
}

sábado, 21 de febrero de 2009

ESTRUCTURA DE DATOS

Estructura de datos es una forma de organizar un conjunto de datos elementales con el objetivo de facilitar su manipulación. Un dato elemental es la mínima información que se tiene en un sistema.
Una estructura de datos define la organización e interrelación de éstos y un conjunto de operaciones que se pueden realizar sobre ellos. Las operaciones básicas son:
Alta, adicionar un nuevo valor a la estructura.
Baja, borrar un valor de la estructura.
Búsqueda, encontrar un determinado valor en la estructura para realizar una operación con este valor, en forma SECUENCIAL o BINARIO (siempre y cuando los datos estén ordenados)...
Otras operaciones que se pueden realizar son:
Ordenamiento, de los elementos pertenecientes a la estructura.
Apareo, dadas dos estructuras originar una nueva ordenada y que contenga a las apareadas.
Cada estructura ofrece ventajas y desventajas en relación a la simplicidad y eficiencia para la realización de cada operación. De esta forma, la elección de la estructura de datos apropiada para cada problema depende de factores como la frecuencia y el orden en que se realiza cada operación sobre los datos.

DATO

CONCEPTOS BASICOS
Estructura: Es la manera como se pueden organizar los datos para que puedan ser interpretados de forma lógica y ordenada.
Dato: Es la unidad mínima de información, por si misma no tiene significado pero al organizar de forma lógica una cantidad establecida, se logra obtener un significado coherente.
Algoritmo: Es un conjunto de pasos finitos ordenados con el cual obtenemos la resolución de un problema especifico.
Programa: Es un conjunto de instrucciones que puede interpretar un computador con el fin de realizar un proceso especifico.
Recursividad: Propiedad de algunos lenguajes de programación de permitir que un programa solicite su propia ejecución en el curso de su desarrollo.
Iteratividad: Las estructuras iterativas son aquellas que nos permiten repetir varias veces un proceso.
Abstracción: Consiste en aislar un elemento de su contexto o del resto de los elementos que lo acompañan.
Clase: Es una plantilla o un prototipo para crear objetos, por eso se dice que los objetos son instancias de clases.
Objeto: Se define como la unidad que en tiempo de ejecución realiza las tareas de un programa.


TEMARIO

DEFINICIONES BASICAS

ESTRUCTURAS LINEALES

ESTRUCTURAS NO LINEALES

ESTRUCTURAS RECURSIVAS

ESTRUCTURAS RELACIONALES

ORDENAMIENTO Y BUSQUEDA