Académique Documents
Professionnel Documents
Culture Documents
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.
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
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
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
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