Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Ejemplos Recursividad

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 6

PROGRAMACION II.

RECURSIVIDAD

UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO. TRUJILLO

PROFESOR: JOSE DELPHIN

PROGRAMACION II. RECURSIVIDAD Recursividad: La recursividad es una tcnica de programacin que se utiliza para realizar una llamada a una funcin desde ella misma, de all su nombre. El ejemplo ms utilizado por su fcil comprensin es el clculo de nmeros factoriales. El factorial de 0 es, por definicin, 1. Los factoriales de nmeros mayores se calculan mediante la multiplicacin de 1 * 2 * ..., incrementando el nmero de 1 en 1 hasta llegar al nmero para el que se est calculando el factorial. Un algoritmo recursivo es un algoritmo que expresa la solucin de un problema en trminos de una llamada a s mismo. La llamada a s mismo se conoce como llamada recursiva o recurrente.
#include <iostream> #include <cstdlib> using namespace std; int Factorial(int n); int main(){ int valor; system("clear"); cout << "Introduzca numero a calcular: "; cin >> valor; cout << "\nEl Factorial de " << valor << " es: " << Factorial(valor) << endl; return 0;

int Factorial(int n){ if (n < 0){ cout << No existe el factorial de un numero negativo.\n; }else if(n < 2){ return 1; }else return n * Factorial(n-1);

Generalmente, si la primera llamada al subprograma se plantea sobre un problema de tamao u orden N, cada nueva ejecucin recurrente del mismo se plantear sobre problemas, de igual naturaleza que el original, pero de un tamao menor que N. De esta forma, al ir reduciendo progresivamente la complejidad del problema a resolver, llegar un momento en que su resolucin sea ms o menos trivial (o, al menos, suficientemente manejable como para resolverlo de forma no recursiva). En esa situacin diremos que estamos ante un caso base de la recursividad. Es frecuente que los algoritmos recurrentes sean ms ineficientes en tiempo que los iterativos aunque suelen ser mucho ms breves en espacio. Recursividad directa vs indirecta. Cuando en una subrutina hay llamadas a ella misma se habla de recursividad directa, en contraposicin, cuando se tienen varias subrutinas y stas se llaman unas a otras formando ciclos se dice que la recursin es indirecta.
Subrutina_A Subrutina_A Subrutina_A Subrutina_A Subrutina_B Subrutina_C Subrutina_D Subrutina_A

Propiedades de las definiciones o algoritmos recursivos:

No debe generar una secuencia infinita de llamadas as mismo, dicho de otro modo ha de existir al menos un caso base. PROFESOR: JOSE DELPHIN

PROGRAMACION II. RECURSIVIDAD

Una funcin recursiva f debe definirse en trminos que no impliquen a f al menos en un argumento o grupo de argumentos. Debe existir una "salida" de la secuencia de llamadas recursivas. Cada llamada recurrente se debera definir sobre un problema de menor complejidad (algo ms fcil de resolver).

Programacin Recursiva: Es mucho mas difcil desarrollar una solucin recursiva en un lenguaje determinado para resolver un problema especifico cuando no se tiene un algoritmo. No es solo el programa sino las definiciones originales y los algoritmos los que deben desarrollarse. En general, cuando encaramos la tarea de escribir un programa para resolver un problema no hay razn para buscar una solucin recursiva. La mayora de los problemas pueden resolverse de una manera directa usando mtodos no recursivos. Sin embargo, otros pueden resolverse de una manera mas lgica y elegante mediante la recursin. Volviendo a examinar la funcin factorial. El factor es, probablemente, un ejemplo fundamental de un problema que no debe resolverse de manera recursiva, dado que su solucin iterativa es directa y simple. Sin embargo, examinaremos los elementos que permiten dar una solucin recursiva. Antes que nada, puede reconocerse un gran nmero de casos distintos que se deben resolver. Es decir, quiere escribirse un programa para calcular 0!, 1!, 2! Y as sucesivamente. Puede identificarse un caso "trivial" para el cual la solucin no recursiva pueda obtenerse en forma directa. Es el caso de 0!, que se define como 1. El siguiente paso es encontrar un mtodo para resolver un caso "complejo" en trminos de uno mas "simple", lo cual permite la reduccin de un problema complejo a uno mas simple. La transformacin del caso complejo al simple resultara al final en el caso trivial. Esto significara que el caso complejo se define, en lo fundamental, en trminos del mas simple. Ejemplo de la sucesin de Fibonacci En matemticas, la sucesin de Fibonacci es la siguiente sucesin infinita de nmeros naturales: 0,1,1,2,3,5,8,13,21,34,55,89,144... El primer elemento es 0, el segundo es 1 y cada elemento restante es la suma de los dos anteriores: 0 fi = 1 f(i-2)+f(i-1) si i = 0 si i = 1 si i > 1

A cada elemento de esta sucesin se le llama nmero de Fibonacci. Esta sucesin fue descrita en Europa por Leonardo de Pisa, matemtico italiano del siglo XIII tambin conocido como Fibonacci. El cdigo en C++ que representa la funcin Fibonacci es el siguiente:
#include <iostream> #include <cstdlib> using namespace std; int Fibonacci(int n);

PROFESOR: JOSE DELPHIN

PROGRAMACION II. RECURSIVIDAD


int main(){ int valor; system("clear"); cout << "Introduzca numero a calcular: "; cin >> valor; cout << "\nEl Fibonacci de " << valor << " es: " << Fibonacci(valor) << endl; return 0; }

int Fibonacci(int n){ if (n < 0){ cout << No existe Fibonacci para numeros negativos.; } else if (n == 0) { return 0; } else if (n == 1) { return 1; }else return Fibonacci(n-2) + Fibonacci(n -1); }

PROFESOR: JOSE DELPHIN

PROGRAMACION II. RECURSIVIDAD

Ejemplo de las Torres de Hanoi:

Hay tres postes: A, B y C. En el poste A se ponen cinco discos de dimetro diferente de tal manera que un disco de dimetro mayor siempre queda debajo de uno de dimetro menor. El objetivo es mover los discos al poste C usando B como auxiliar. Slo puede moverse el disco superior de cualquier poste a otro poste, y un disco mayor jams puede quedar sobre uno menor. Considrese la posibilidad de encontrar una solucin. En efecto, ni siquiera es claro que exista una. Ahora se ver si se puede desarrollar una solucin. En lugar de concentrar la atenci en una solucin para cinco discos, considrese el caso general de n discos. Supngase que se tiene una solucin para n 1 discos y que en trminos de sta, se pueda plantear la solucin para n 1 discos. El problema se resolvera entonces. Esto sucede porque en el caso trivial de un disco (al restar 1 de n de manera sucesiva se producir, al final, 1) la solucin es simple: slo hay que mover el nico disco del poste A a C. As se habr desarrollado una solucin recursiva si se plantea una solucin para n discos en trminos de n 1. Considrese la posibilidad de encontrar tal relacin. Para el caso de cinco discos en particular, supngase que se conoce la forma de mover cuatro de ellos del poste A al otro, de acuerdo con las reglas. Cmo puede completarse entonces el trabajo de mover el quinto disco? Cabe recordar que hay 3 postes disponibles. Supngase que se supo cmo mover cuatro discos del poste A al C. Entonces, se pondr mover stos exactamente igual hacia B usando el C como auxiliar. Esto da como resultado la situacin los cuatro primeros discos en el poste B, el mayor en A y en C ninguno. Entonces podr moverse el disco mayor de A a C y por ltimo aplicarse de nuevo la solucin recursiva para cuatro discos para moverlo de B a C, usando el poste A como auxilia. Por lo tanto, se puede establecer una solucin recursiva de las torres de Hanoi como sigue: Para mover n discos de A a C usando B como auxiliar: 1. 2. 3. 4. Si n = = 1, mover el disco nico de A a C y parar. Mover el disco superior de A a B n 1 veces, usando C como auxiliar. Mover el disco restante de A a C. Mover los disco n 1 de B a C usando A como auxiliar

Con toda seguridad este algoritmo producir una solucin completa por cualquier valor de n. Si n = = 1, el paso 1 ser la solucin correcta. Si n = = 2, se sabe entonces que hay una solucin para n 1 = = 1, de manera tal que los pasos 2 y 4 se ejecutaran en forma correcta. De manera anloga, cuando n = = 3 ya se habr producido una solucin para n 1 = = 2, por lo que los pasos 2 y 4 pueden ser ejecutados. De esta forma se puede mostrar que la solucin funciona para n = = 1, 2, 3, 4, 5,... hasta el valor para el que se desee encontrar una solucin. Advirtase que la solucin se desarroll mediante la identificacin de un caso trivial (n = = 1) y una solucin para el caso general y complejo (n) en trminos de un caso mas simple (n 1). Ya se demostr que las transformaciones sucesivas de una simulacin no recursiva de una rutina PROFESOR: JOSE DELPHIN

PROGRAMACION II. RECURSIVIDAD recursiva pueden conducir a un programa mas simple para resolver un problema. Ahora se simular la recursin del problema y se intentar simplificar la simulacin no recursiva.
#include <iostream> #include <cstdlib>

using namespace std;

int hanoi(int n, char origen, char destino, char auxiliar);

int main(){ int valor; system("clear"); cout << "Introduzca numero a calcular: "; cin >> valor; hanoi(valor,'A','B','C'); return 0; }

int hanoi(int n, char origen, char destino, char auxiliar){ if (n <= 1){ cout << "\nmover disco 1 del poste "<< origen << " al poste " << destino << endl; }else { hanoi(n-1, origen, auxiliar, destino); cout << "\nmover disco " << n << " del poste " << origen << " al poste "<< destino; hanoi (n-1, auxiliar, destino, origen); } }

PROFESOR: JOSE DELPHIN

También podría gustarte