Acerca de:

Este blog contiene los códigos, ejemplos y bases de datos que he usado cuando aprendía acerca de algún tema específico. En lugar de borrarlos (una vez dominado ya el tema), he decidido publicarlos :)

sábado, 20 de junio de 2015

Calculando el MCD de dos números de forma recursiva en Prolog

El mismo algoritmo de esta entrada, pero esta vez en Prolog!

La lógica de Prolog es la siguiente: devuelve el valor de retorno en la variable del extremo derecho. Si no se declara la tercera variable en este caso, devolverá True pues estará comparando las dos variables de entrada solamente. El signo de exclamación es para detener el backtracking, la coma es el AND lógico, y el punto y coma el OR lógico. Cada declaración de la función "mcd" equivale a un if.


mcd(1, 1, 1):-!. % Func<int, int, int>mcd;
mcd(0, 0, 0):-!.
mcd(X, Y, Z):- X =:= Y, Z is X,!.
mcd(X, Y, Z):- X > Y, X1 is X-Y, mcd(X1, Y, Z1), Z is Z1.
mcd(X, Y, Z):- X < Y, X1 is Y-X, mcd(X1, X, Z1), Z is Z1.


Este código está basado en esta función, que calcula el factorial de un número:

fact(0, 1):-!.
fact(X, Y):- X > 0, X1 is X-1, fact(X1, Y1), Y is X*Y1.


Estoy usando SWI Prolog 7.2.

miércoles, 17 de junio de 2015

Calculando el MCD de dos números de forma recursiva en C#

El algoritmo que estoy usando es bastante simple (nos lo dio un profesor durante una clase):

Se tienen dos números, "x" e "y", si son iguales retornar cualquiera de ellos.
Si x > y, hacer x = x-y;
Si x< y hacer x = y-x; y =x;
repetir hasta que x=y.

Creo que está basado en el algoritmo de Euclides. En lugar de implementarlo como un bucle, creé una función lambda recursiva:

Func<int, int, int> MCD = null;
       
        MCD = (x, y) =>
        {
            if (x == y) return x;
           
            if (x > y) return MCD(x - y, y);
            if (
x < y) return MCD(y - x, x);
           
            return 1;
        };


La forma de llamarla es:

Console.WriteLine(MCD(15,45));