Вы находитесь на странице: 1из 6

Aqu est el algoritmo ptimo del mximo comn divisor (recursivo), creado por Euclides (la notacin a % b es el resto

de dividir a por b): funcin mcd(a, b): ........si a = 0: retornar b ........si a != 0: retornar mcd(a, b % a) Y aqu el algoritmo ptimo para el mnimo comn mltiplo, utilizando el algoritmo para el mnimo comn divisor ya creado: funcin mcm(a, b): ........retornar (a * b) / mcd(a, b)

Ooootro post sobre recursividad, pero no se preocupen ya solo queda este y otro. Esta vez vamos a calcular el mximo comn divisor de dos nmeros de forma recursiva en c++.
#include<stdio.h> int MCD(int x, int y) { if(y==0) return x; else return MCD(y, x%y); } int main() { int num1=0,num2=0; printf("::MAXIMO COMUN DIVISOR::\n"); printf("Introduce el primer numero: ");scanf("%i",&num1); printf("Introduce el segundo numero: ");scanf("%i",&num2); printf("\tEl resultado es: %i\n", MCD(num1, num2)); return 0; }

Veamos otro problema comn que se suele resolver aplicando recursividad. El algoritmo de Euclides sirve para calcular el mximo comn divisor de dos nmeros. El mcd se define as: Dados dos enteros a y b distintos de 0, decimos que el entero d mayor o iguak a 1 es un mcd de a y b si d divide a a y a b, y para cualquier otro entero c tal que c divida a a y a b, entonces c tambin divide a d. El algoritmo de Euclides parte de la proposicin de, siendo a y b dos enteros distintos de cero, el mcd de a y b es el mismo que el de b y r, donde r es un entero mayor o igual que cero y menor que b, se calcula como el resto de la divisin entera entre a y b.

La ventaja es que r es un entero de menor que a. El algoritmo aprovecha esto para calcular el mcd de forma recursiva.
mcd(a,b) - si a < b, retornar mcd(b,a) - si b == 0, retornar a - retornar mcd(b, a % b)

La implementacin es realmente sencilla:

// Algoritmo de Euclides // (C) 2009 Con Clase // Salvador Pozo #include <iostream> using namespace std; int mcd(int, int); int main() { int a, b; a = 364332; b = 30252; cout << "mcd(" << a << ", " << b << ")= " << mcd(a,b) << endl; return 0; } int mcd(int a, int b) { if(a < b) return mcd(b,a); if(b == 0) return a; return mcd(b, a % b); }

Mnimo comn mltiplo Cdigo realizado en C++ que calcula el mnimo comn mltiplo de un par de nmeros superior a 1.

#include <conio.h> #include <iostream.h>

int main(int argc, char* argv[]) { int a, b, x, z, y=1, i=2; cout<<"ingrese primer numero: \n"; cin>>a; cout<<"ingrese segundo numero: \n";

cin>>b; if (a<b){x=a; z=b;} else {x=b; z=a;}

do{ if (x%i==0){ if(z%i==0){ y=y*i; x=x/i; z=z/i; i=2; } else i++; } else i++; } while(i<=x);

y=y*z*x;

cout<<"el MCM es "<<y<<"\n";

getch(); getch(); return 0; }

Solucin: Para calcular el mcm (o el mcd) de ms de dos nmeros, basta con calcularlo para los primeros dos, despus calculamos el mcm entre el

resultado y el tercer nmero, y as sucesivamente con los dems nmeros.

menzamos declarando entre las lneas 1 y 2 las variables a utilizar. Para los ciclos emplearemos i y j, c para la cantidad de casos, m para la cantidad de enteros en cada caso, t como variable temporal y n para guardar el resultado. Como los nmeros son enteros positivos de 32 bits, utilizamos variables de tipo cardinal (equivalente a longword). En la funcin mcd calculamos el mximo comn divisor de los parmetros a y b. La implementacin es directa, siguiendo el algoritmo de Euclides. La lnea 6 es la frmula recursiva, mientras que la 7 es el caso base que hace que la recursividad termine. La siguiente funcin, mcm, es en la que calculamos el mnimo comn mltiplo. En la lnea 13 calculamos el mcm empleando el mcd. Para evitar desbordamientos, primero efectuamos la divisin y despus la multiplicacin; y para evitar divisiones entre cero, revisamos que ni a ni b sean cero (lnea 12). Entre la lnea 16 y 29 tenemos la parte principal del programa. En la lnea 17 leemos la cantidad de casos a procesar. Despus, en la lnea 20 leemos m y n. Continuamos calculado el mcm entre el resultado anterior (que en el inicio es el primer nmero) y cada nuevo nmero que leemos (lneas 21 a 25). Terminamos pasando a la siguiente lnea en la entrada y escribiendo el

resultado Casos ejemplo


Entrada:

en

la

salida

(lneas

26

27).

1 3 5 15 7 mcd( 5,15) mcd(15, 5) mcd( 5, 0) mcm( 5,15) mcd(15, mcd( 7, mcd( 1, mcm(15, 7) 1) 0) 7)

= = = = = = = =

mcd(15, 5 mod 15) mcd( 5, 15 mod 5) 5 (5/5)15 = 15 mcd(7, 15 mod 7) mcd(1, 7 mod 1) 1 (15/1)7 = 105

Desarrollo:

Salida: Entrada:

mcm(5,15,7) = 105 105 1 3 25 58 3 mcd(25,58) mcd(58,25) mcd(25, 8) mcd( 8, 1) mcd( 1, 0) mcm(25,58) mcd(1450,3) mcd( 3, 1) mcd( 1, 0) mcm(1450,3)

= = = = = =

mcd(58, 25 mod 58) mcd(25, 58 mod 25) mcd(8, 25 mod 8) mcd(1, 8 mod 1) 1 (25/1)58 = 1450 mcd(3, 1450 mod 3) mcd(1, 3 mod 1) 1 (1450/1)3 = 4350

Desarrollo: = = = =

Salida:

mcm(25,58,3) = 4350 4350

http://pier.guillen.com.mx/algorithms/05-aritmetica/05.2-mcd-mcm.htm

Recursividad aplicada: Serie de Fibonacci


Guardado en: Programas el 17 de agosto del 2010 Etiquetas: fibonacci, recursividad

0, 1, 1, 2, 3, 5, 8, 13, 21, , la serie de Fibonacci es bastante interesante e incluso aparece en la naturaleza. Comienza con un 0, luego un 1 y a partir de ah cada nmero

es la suma de los dos siguientes. Eso ltimo nos indica recursividad. Veamos como mostrar n nmeros de la serie de Fibonacci de forma recursiva en C++.
#include<stdio.h> int fibonacci(int n) { if (n<2) return n; else return fibonacci(n-1) + fibonacci(n-2); } int main() { int num=0,res=0; printf("::NUMEROS DE FIBONACCI::\n"); printf("Introduce el numero de numeros: ");scanf("%i",&num); printf("\t"); for(int i=0;i<=num-1;i++) { res = fibonacci(i); printf("%i ", res); } printf("\n"); return 0; }

Es la primera vez que vemos un la llamada a la funcin dentro de un ciclo. Eso es porque la funcin calcula el n-simo nmero de la serie, y para mostrarlos todos tenemos que hacer un ciclo que repita la funcin tantas veces como sea necesario.

Posts Relacionados
http://codigoc.org/386-recursividad-aplicada-serie-de-fibonacci

Вам также может понравиться