Vous êtes sur la page 1sur 12

ALUMNOS: JOS JUAN MOTA TORRES

PILAR BENITEZ MATA AIXA SELENE SARMIENTO HERNANDEZ

MATERIA:ESTRUCTURA DE DATOS TRABAJO UNIDAD IV

INDICE RECURSIVIDAD! 4.2 Procedimientos recursivos! 4.3 Mecnica de recursin! 4.4 Transformacin de algoritmos recursivos a iterativos ! 4.5 Recursividad en el diseo! 4.6 Complejidad de los algoritmos recursivos! 3 4 7 8 9 11

RECURSIVIDAD
Podemos denir la recursividad como un proceso que se dene en trminos de s mismo. Siendo un poco ms precisos, y para evitar el aparente crculo sin n en esta denicin, las instancias complejas de un proceso se denen en trminos de instancias ms simples, estando las nales ms simples denidas de forma explcita. Esta tcnica de programacin se conoce como divide y vencers y es el ncleo en el diseo de numerosos algoritmos de gran importancia, as como tambin es parte fundamental de la programacin dinmica. La recursin, consiste en el uso de mtodos recursivos, es una herramienta de programacin potente que en muchos casos puede producir algoritmos cortos y ecientes. El concepto de recursin es difcil de precisar, pero existen ejemplos de la vida cotidiana que nos pueden servir para darnos una mejor idea acerca de lo que es recursividad. Un ejemplo de esto es cuando se toma una fotografa de una fotografa, o cuando en un programa de televisin un periodista transere el control a otro periodista que se encuentra en otra ciudad, y este a su vez le transere el control a otro.

4.2 Procedimientos recursivos


Los conejos de Fibonacci Cierto matemtico italiano de nombre Leonardo de Pisa, pero mejor conocido como Fibonacci, propuso el siguiente problema: Suponga que acabamos de comprar una pareja de conejos adultos. Al cabo de un mes, esa pareja tiene una pareja de conejitos (un conejo y una coneja). Un mes despus, nuestra primera pareja tiene otra pareja de conejitos (nuevamente, un conejo y una coneja) y, al mismo tiempo, sus primeros hijos se han vuelto adultos. As que cada mes que pasa, cada pareja de conejos adultos tiene una pareja de conejitos, y cada pareja de conejos nacida el mes anterior se vuelve adulta. La pregunta es, cuntas parejas de conejos adultos habr al cabo de n meses? Para resolver este problema, llamemos Fn al nmero de parejas adultas al cabo de n meses. No es difcil convencerse de que si n es al menos 2, entonces Fn es igual a Fn-1 + Fn-2. Por qu? As que Fn queda en trminos de Fn-1 y Fn-2, que a su vez quedan en trminos de Fn-2, Fn-3 y Fn-4, que a su vez... Ahora salimos del crculo vicioso recordando que al principio haba una pareja de conejos adultos, la misma que haba al nal del primer mes, as que F0 = F1 = 1. Hagamos un ejemplo: F4 = F3 + F2 = (F2 + F1) + (F1 + F0) = ((F1 + F0) + 1) + (1 + 1) = ((1 + 1) + 1 ) + 2 = (2 + 1) + 2 = 3 + 2 = 5. La sucesin de nmeros F0 = 1, F1 = 1, F2 = 2, F3 = 3, F4 = 5, etc. recibe el nombre de sucesin de Fibonacci. A continuacin se muestra el cdigo recurso, que resuelve el problema de Fibonacci. int b(int n) { if ((n == 0) || (n == 1)) return 1; else return b(n-1) + b(n-2); } El tringulo de Pascal En algn momento de tu vida habrs aprendido que (x + z)2 = x2 + 2xz + z2, que (x + z)3 = x3 + 3x2z + 3xz2 + z3 y, en general, para cualquier entero positivo n, a calcular los coecientes de (x + z)n, y posiblemente le diste el nombre de nCm al coeciente de xmzn-m. Seguramente recuerdas la siguiente tabla triangular: 1 11 121 1331 14641 ...... Esa tabla se conoce como tringulo de Pascal y se construye como sigue: Al principio se coloca un 1 (que corresponde con 0C0). Para cada rengln subsecuente, digamos para el rengln n, se coloca un 1 a la izquierda y un 1 a la derecha (que corresponden con nC0 y nCn, respectivamente) y los elementos restantes se calculan sumando los dos nmeros que tiene justo arriba a la izquierda y arriba a la derecha, es decir, nCm = n-1Cm-1 + n-1Cm para toda 0 < m < n.
4

Entre otras cosas, el nmero nCm cuenta la cantidad de formas de escoger m objetos de un total de n objetos distintos. A estos nmeros tambin se les llama las combinaciones de m objetos en n. A continuacin se muestra el cdigo recursivo; int comb(int n, int m) { if ((n == 0) || (n == m)) return 1; else return comb(n-1,m-1) + comb(n-1,m); } Bsqueda binaria Imagina que deseas encontrar el nmero de telfono de algn amigo en el directorio telefnico. Por supuesto, lo nico que sabes es el nombre de tu amigo y que, afortunadamente, el directorio telefnico est ordenado alfabticamente. Una forma sencilla de encontrar el telfono es como sigue. Compara la primera entrada del directorio con el nombre de tu amigo, si son iguales ya acabaste, si no compara la segunda entrada del directorio con el nombre de tu amigo, si son iguales ya acabaste, si no compara la tercera entrada... Esto funciona muy bien si el directorio tiene muy pocas entradas, pero si tiene muchas resulta bastante lento. Qu pasara si el nombre de tu amigo comienza con Z? Una forma mejor es como sigue: Abre el directorio a la mitad y compara la entrada que veas con el nombre de tu amigo. Si son iguales ya acabaste. Qu pasa si no son iguales? Una de dos: o bien el nombre de tu amigo est antes del que viste, o bien est despus. En cualquier caso, has reducido la tarea de encontrar a tu amigo en todo el directorio a encontrarlo en una de sus mitades. Es decir, has dividido la tarea en dos. Por supuesto, el mtodo contina de la misma forma con la mitad restante, hasta que nalmente obtengas una seccin del directorio que contiene solamente una entrada. En ese momento, puede ser esa entrada corresponda con el nombre de tu amigo, o que tu amigo no estuviera en el directorio. Para simplicar, supongamos que la lista contiene nmeros en lugar de nombres y que los nmeros estn ordenados de forma ascendente. Llamemos N a la cantidad de nmeros, L1, L2, ..., LN a los miembros de la lista, y X al nmero que estamos buscando. Tambin llamemos IZQ al ndice izquierdo, DER al ndice derecho y MED al punto medio de la parte de la lista que an estamos considerando. Al principio IZQ = 1 y DER = N. Entonces, podemos ver que el siguiente algoritmo funciona como queremos: Binaria(IZQ, DER) Comienza Si IZQ < DER entonces MED = (IZQ + DER)/2 Si LMED < X entonces Binaria(MED, DER) Si no entonces Binaria(IZQ, MED) Si no entonces si LIZQ = X Imprime "Encontrado en la posicin" IZQ Si no entonces Imprime "El elemento buscado no est" Termina

Las torres de Hanoi


5

Una antigua leyenda dice que en cierto monasterio de Hanoi haba tres postes y que en uno de ellos haba 64 discos de tamao decreciente, uno encima de otro y con el mayor hasta abajo. Los monjes del monasterio han estado trabajando sin cesar para llevar los discos desde su poste original hasta algn otro siguiendo una regla sencilla: solamente pueden mover un disco a la vez de un poste a otro, siempre y cuando queda arriba de uno mayor. La leyenda indica que el mundo terminar en el momento en que los monjes hayan logrado su propsito. Nuestra labor ser ayudarles a los monjes en el proceso. Llamemos a los postes A, B y C (siendo Al poste original y C el poste al que queremos mover todos los discos). Si solamente hubiera un disco, la tarea hubiera sido muy sencilla: movamos el nico disco del poste A al poste C (y el mundo se hubiera terminado en un santiamn). Si solamente hubieran dos discos, la tarea no hubiera sido mucho ms difcil: basta mover el disco pequeo al poste B, despus el disco grande al poste C y nalmente el disco pequeo al poste C. Si continuamos de esta manera, pronto nos daremos cuenta que la labor monumental de mover los 64 discos se reduce a la siguiente: movamos los 63 discos ms pequeos del poste A al B, movamos el disco ms grande del poste A al C y nalmente movamos los 63 discos ms pequeos del poste B al C. Cmo hacemos para mover los 63 discos? Lo haremos de la misma forma, excepto que renombrando los postes adecuadamente. Observa que, de esta manera, hemos dividido la tarea de mover n discos en dos tareas menores. As, podemos convencernos de que el siguiente algoritmo recursivo mueve n discos de un poste original a un poste destino utilizando un tercer poste auxiliar:

Hanoi(n, Original, Auxiliar, Destino) Comienza Si n es mayor que 0 entonces Hanoi(n-1, Original, Destino, Auxiliar) Mueve un disco de Original a Destino Hanoi(n-1, Auxiliar, Original, Destino) Termina

4.3 Mecnica de recursin


Pasos para elaborar un algoritmo recursivo 1) Establecer explcitamente un caso simple del termino que se va a denir. 2) Establecer los otros casos aplicando una operacin al resultado del caso simple. 3) Cuidar que las simplicaciones sucesivas de cualquier caso nos conduzcan por ultimo al caso simple. 4) Cuidar que el algoritmo no genere una secuencia de llamadas a si mismo. 5) Para al menos un argumento debe denirse la cuestin en trminos que no implique llamarse as mismo. Ejemplo: Funcin Factorial 1.- caso simple ---> 0!=1 y 1!=1 2.- otros casos ---> n*(n-1)! 3.- restar sucesivamente 1 de n termina por conducir a 0 4.- Forma de salir que no genere llamadas recursivas ---> 0!=1 5.- Forma de salir que no genere llamadas recursivas ---> 0!=1

4.4 Transformacin de algoritmos recursivos a iterativos


Todo algoritmo recursivo siempre se pude transformar en un algoritmo iterativo y recprocamente, todo algoritmo iterativo se puede escribir de forma recursiva. Algunos algoritmos son ms fciles de entender si se escriben de forma iterativa, pero otros resultan ms intuitivos si se escriben recursivamente. Por lo tanto, se debe ser capaz de usar cualquiera de los dos tipos de algoritmos, y de saber en qu casos es mejor uno u otro. El inconveniente ms importante de la recursividad es que introduce la necesidad de realizar una serie de llamadas recursivas, con el coste computacional que ello supone. La transformacin de algoritmos recursivos en iterativos en general puede ser complejo. Hay algunos casos, sin embargo, en que es bastante sencillo y se puede realizar de forma mecanica. La recursividad puede substituirse por ciclos (tantos como llamadas) y pilas para manejar las variables (de forma semejante a lo que se realiza en la pila del programa) o bien con el uso de variables auxiliares

4.5 Recursividad en el diseo


Un procedimiento recursivo es aquel que se llama a si mismo, para poder funcionar tiene que tener una condicin de salida que de el numero de veces que se va a llamar a si mismo el procedimiento. La recursividad en diseo se reere a la manera de cmo representar los procedimientos recursivos al momento de disear los programas. Dependiendo del mtodo que utilicemos para disear la representacin graca de la recursividad va a ser diferente sin embargo el procedimiento va a ser similar ya que el n es el mismo poner una condicin que nos diga si llamamos al mtodo o que nos mande terminarlo. Un ejemplo en una funcin genrica seria este: METODO1 { Procedimiento x; Condicin ( ) { Llamada al metodo1; } Fin; } En un diagrama seria algo as:

Lo importante y que tenemos que tomar en cuenta es que la si se cumple el criterio para llamar el procedimiento hay que apuntar a el inicio del mtodo, y al no cumplirse debe apuntar al siguiente paso en el procedimiento o al nal o viceversa. Ejemplo: Disear un programa que despliegue el contenido de un arreglo el siguiente arreglo: { a, e, i, o, u}
9

Seudo cdigo: 1. Creamos la forma que contendr una listbox para despliegue. 2. Creamos el arreglo que contendr los elementos (vocales) 3. Despus creamos el mtodo despliegue. El cual contendr: a. Un ciclo for (int i=0;i4;i++) dentro del cual se har el despliegue en el ndice i del arreglo vocales b. llamara al mtodo despliegue. 5. En el constructor mandamos llamar al mtodo despliegue. Y listo al abrir nuestro programa vamos a desplegar dentro del listbox el arreglo mediante la recursividad. Para ver un programa visual de recursividad ver el tema recursividad.

10

4.6 Complejidad de los algoritmos recursivos


Un algoritmo recursivo es un algoritmo que se dene en trminos de s mismo. Son implementados en forma de subprogramas (funciones, subrutinas, procedimientos, etc) de tal forma que dentro de un subprograma recursivo hay una o ms llamadas a l mismo. FUNCIN Factorial(n) INICIO SI (n<2) ENTONCES Factorial = 1; SINO Factorial = n * Factorial(n-1); FIN-SI FIN 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, sucientemente manejable como para resolverlo de forma no recursiva). En esa situacin diremos que estamos ante un caso base de la recursividad. O (2n): en algoritmos con dos llamadas recursivas y cuyo ejemplar disminuye en una unidad por llamada O (kn): en algoritmos con k llamadas recursivas y cuyo ejemplar disminuye en una unidad por llamada

11

FUENTES
http://www.programacionfacil.com/ estructura_datos_csharp:complejidad_algoritmos_recursivos http://es.wikipedia.org/wiki/Algoritmo_recursivo http://web.jet.es/jqc/practica2.PDF http://estruturadedatos.wordpress.com/unidad-4-recursividad/4-4-transformacion-dealgoritmos-recursivos-a-iterativos/ http://iscestructuradedatosjesusolivas.blogspot.mx/2008/10/4.html http://www.slideshare.net/betzyrod/recursividad

12

Vous aimerez peut-être aussi