domingo, 26 de septiembre de 2010

Hola compañeros, aqui les pongo dos programas con lenguajes muy interesantes aunque ya casi no se utilizan en la actualidad.


HASKEL


Unas de las características mas importantes que podemos decir del lenguaje Haskell es el soporte de tipo de datos y funciones recursiva como lo vimos la clase pasada, también es muy bueno en la manipulación de las lisas y las celdas de patrones 
Aquí les dejo un manual y su compilador por si les interesa en el futuro.



COMPILADOR
MANUAL


También les dejo un sencillo ejemplo, que lo que hace es decirte la longitud de palabras que tu le desees ingresarle.


EJEMPLO



longitud::[a]->Int
longitud[]=0
longitud(_:xs)=1+longitud xs
main=putStrLn "MaXo's"


ERLANG


El lenguaje erlang es un lenguaje funcional, con evualuacion algo estricta, y fue diseñado por la compañia Ericsson.
Algo que hace muy util este lengujae es que se puede cambiar el codigo al instante pero sin parar el simstema. La gestion y la creación es trivial, pero en Erlang toda concurrencia es explícita.
Aqui les dejo un manual que les ayudara a entender un poco mas este lenguaje y su respectivo compilador 


MANUAL
COMPILADOR


Este es otro sencillo programa que  es la serie de fibonacci 


fibonacci(0) -> 0 ;
fibonacci(1) -> 1 ;
fibonacci(N) when N > 0 -> fibonacci(N-1) + fibonacci(N-2) .



Espero que aya sido de su agrado y muchas gracias y espero que comenten :)

miércoles, 22 de septiembre de 2010

Recursividad (puntos extras)

Hola compañeros les hablare un poco sobre la recursividad y su uso en la programación 



La recursividad es muy importante ya que se utiliza para realizar una llamada a una función desde la misma función, un ejemplo clásico de ello es el cálculo de números factoriales
 Como sabemos factorial de 0 es, pero los factoriales de números mayores se calculan multiplicando  1 * 2 * ..., así sucesivamente incrementando el número de 1 en 1 hasta llegar al número para el que deseamos calcular 

#include
void main(void)
{
int i, s, n;
long int f;
printf("Ingresa un numero: ");
scanf("%d", &n);
s=0;
f=1;
for (i=1; i<=n; i++) {
s *= i;
f *= i;
}
printf("El factorial de %d es: %ld\n", n, f);
getch();
return 0;
}

Para definir una función en forma recursiva es necesario especificar:

  • Caso(s) base: Donde la recursividad se detien.
  • Paso de recursión: Como se define un elemento distinto del base, en términos de elementos anteriores.
En la actualidad los lenguajes de programación permiten definir funciones de manera recursiva, como por ejemplo el lenguaje C:
       int factorial(int n) {
          if ((n == 0) || (n == 1))
             return(1);
          else
             return(n*factorial(n-1));
       }
    
También las definiciones recursivas pueden expresarse en forma no recursiva dependiendo  del caso, el resultado puede ser más revuelto, una función en C que calcula el factorial en forma iterativa puede ser como la siguiente 
       int factorial(int n) {
          int i, fact = 1;
    
          for (i=2; i<=n; i++)
             fact = fact * i;
          return(fact);
       }
    
Los algoritmos iterativos tienen una ventaja con el uso de memoria, si se comparan con los iterativos. La recursividad necesita  que se guarde el estado de la ejecución antes de cada llamado recursivo, usando mucha memoria, y es probable que esta razón las versiones de recursividad tengan mayores limitaciones al ejecutarse en una computadora.


La aplicación de la recursividad puede ampliarse por ejemplo, para buscar un número en un vector podemos tener una función que reciba como argumento el vector, el rango de búsqueda y el número buscado entre muchas mas.

lunes, 20 de septiembre de 2010

Máquinas de Turing (puntos extras)

Máquina de Turing




La Turing es un dispositivo que nos transforma un "INPUT" en un "OUTPUT" después de algunos pasos. Tanto el INPUT como el OUPUT que tiene números en código binario (ceros y unos). 
Al principio la máquina de Turing trataba en una cinta infinitamente larga con unos y ceros que pasa a través de una caja que era tan fina que solo el trozo de cinta que ocupa un bit (0 ó 1) está en su interior. La máquina tenia una serie de estados internos finitos que también se pueden enumerar en código binario.
Para poder hacer un algoritmo, la maquina se inicializa en un estado interno aleatorio. Después, se pone en marcha y la maquina lee el bit que esta en ese momento en el interior y ejecuta alguna operación con ese bit lo cual puede ser que se cambie o se quede así dependiendo del estado interno. 
Después se mueve para la derecha o hacia la izquierda, y vuelve a repetir el mismo procedimiento de la misma manera. 
Al final se para, dejando el resultado al lado izquierdo por ejemplo.

PASOESTADOCINTA
1s111
2s201
3s2010
4s30100
5s40101
6s50101
7s50101
8s11101
9s21001
10s31001
11s310010
12s410011
13s410011
14s510011
15s111011
PARADA


Estas maquinas realizan estos proceso por medio de un bucle, en el estado inicial s1, reemplaza el primer 1 con un 0, y pasa al estado s2, con el que avanza hasta la derecha, saltando los símbolos 1 hasta un 0 (que tiene que existir), cuando lo encuentra pasa a ser s3, con este estado avanza saltando todos los 1 hasta encontrar otro 0 (la primera vez no habría ningún 1). Una vez en el extremo derecho, añade un 1. Después comienza el proceso de retorno; con s4 vuelve a la izquierda saltando los 1, cuando encuentra un 0 (en el medio de la secuencia), pasa a s5 que sigue a la izquierda saltando los 1 hasta el 0 que se escribió al principio. Se reemplaza de nuevo este 0 por 1, y pasa al símbolo siguiente, si es un 1, se pasa a otra iteración del bucle, pasando al estado s1 de nuevo. Si es un número 0, será el símbolo central, con lo que la máquina se detiene al haber finalizado su proceso 

lunes, 13 de septiembre de 2010

Ordenamiento por Mezcla 
Bueno compañeros esta es la clase que hice sobre el ordenamiento por mezcla espero que les guste.
Esta equipo esta conformado por Lizbeth y Carmen que ellas dieron también el mismo tema  solo que con diferentes instancias.


Muchas gracias