Recursividad
Recursividad
Recursividad
EQUIPO 1 Integrantes: CARLOS ALBERTO NGEL NGEL ANTONIO MARCOS MOSSO ALEJANDRO SILVA JIMNEZ RAL MORENO ESPINOZA DANIEL ESPINOZA BAUTISTA EVA SEGURA BLAS JOHNNY AYVAR DAZ
1. Introduccin
Contenido de la exposicin El objetivo de la exposicin es explicar de manera breve y precisa como funciona la recursividad dentro del mbito de la programacin, conociendo en si su significado, cuando es necesario utilizarlo y para que nos sirve, cuales son sus ventajas y desventajas, entre otras que se vern a lo largo de la exposicin.
1. Introduccin
Manejo de la recursividad (contenido)
Tcnica de programacin Tipos de recursividad Cuenta con ciertas caractersticas distintivas
RECURSIVIDAD
PROCEDIMIENTOS RECURSIVOS
Aplicando la recursividad
EJEMPLOS
2. Recursividad
Qu es la recursividad?
La recursividad tambin conocida como recursin es un concepto muy amplio, con muchas variantes y aparece en numerosas actividades de la vida diaria.
La recursividad como tcnica de programacin puede ser usada para implementar estructuras de repeticin (ciclos) de una manera distinta. Permitiendo que un bloque de instrucciones se ejecute n veces. La recursin es recurso muy poderoso que permite expresar soluciones simples y naturales a cierto tipo de problemas. Es importante considerar que no todos los problemas son naturalmente recursivos, algunos si lo son y otros no.
En Java los mtodos pueden llamarse a s mismos. Si dentro de un mtodo existe la llamada a s mismo decimos que el mtodo es recursivo.
2. Recursividad
Un ejemplo muy claro y sencillo de recursividad es la artesana rusa llamada muecas de Matrushka.
2. Recursividad
Caractersticas Las funciones recursivas se componen de: Caso base: una solucin simple para un caso particular. La secuenciacin, iteracin condicional (if-else) y seleccin (switch) son estructuras de control que se pueden considerar para resolver el caso base.
Caso recursivo: una solucin que involucra volver a utilizar la funcin original, con parmetros que se acerquen mas al caso base. Pasos en el caso recursivo:
1. 2. 3. El procedimiento se llama a si mismo El problema se resuelve, resolviendo el mismo problema pero de menor tamao. La manera en la cual el tamao del problema disminuye asegura que el caso base eventualmente se alcanzara.
2. Recursividad
Verificacin de procesos recursivos
2. Recursividad
Escritura de programas recursivos
1.-Obtencin de una definicin exacta del problema 2.-Determinar el tamao del problema completo que hay que resolver Parmetros en la llamada inicial 3.-Resolver el(los) casos bases o triviales (no recursivos). 4.-Resolver el caso general en trminos de un caso ms pequeo (llamada recursiva).
Algo muy importante a tener en cuenta cuando usemos la recursividad es que es necesario asegurarnos que llega un momento en que no hacemos ms llamadas recursivas. Si no se cumple esta condicin el programa nunca terminar.
2. Recursividad
Por que escribir programas recursivos?
Son mas cercanos a la descripcin matemtica. Generalmente mas fciles de analizar Se adaptan mejor a las estructuras de datos recursivas. Los algoritmos recursivos ofrecen soluciones estructuradas, modulares y elegantemente simples.
2. Recursividad
Cundo usar recursividad?
Para simplificar el cdigo. Cuando un problema es casi irresoluble con las estructuras iterativas Cuando la solucin de un problema se puede hallar solucionando el mismo problema pero con un caso de menor tamao. Cuando la estructura de datos es recursiva ejemplo : rboles.
Cundo no usar recursividad?
Cuando los mtodos usen arreglos largos. Cuando el mtodo cambia de manera impredecible de campos. Cuando las iteraciones sean la mejor opcin.
2. Recursividad
Tipos de recursividad Podemos distinguir dos tipos de recursividad:
Directa: Cuando un subprograma se llama a si mismo una o mas veces directamente. Indirecta: Cuando se definen una serie de subprogramas usndose unos a otros, es decir, el subprograma llama a otro subprograma, y este en algn momento, llama nuevamente al primero.
Procedimientos Recursivos
Recursividad Simple: Aquella en cuya definicin slo aparece una llamada recursiva. Se puede transformar con facilidad en algoritmos iterativos.
Recursividad Mltiple: Se da cuando hay ms de una llamada a s misma dentro del cuerpo de la funcin, resultando ms difcil de hacer de forma iterativa.
Procedimientos Recursivos
Recursividad Anidada: En algunos de los argumentos de la llamada recursiva hay una nueva llamada a s misma.
int Ack( int n, int m ) { if(n==0 ) return(m+1); else if(m==0) return(Ack(n-1,1)); return(Ack(n-1, Ack(n,m-1))); }
Procedimientos Recursivos
Recursividad cruzada o indirecta: Son algoritmos donde una funcin provoca una llamada a s misma de forma indirecta, a travs de otras funciones.
Ej: Par o Impar: int par( int nump ) { if(nump==0) return(1); return( impar(nump-1)); } int impar( int numi ) { if(numi==0) return(0); return( par(numi-1)); }
Recursividad mutua. Si dos procedimientos se llaman mutuamente, el rendimiento puede ser muy deficiente o incluso puede producirse un bucle infinito.
Torres de Hani
Una forma de resolver la colocacin de la torre es fundamentndose en el disco ms pequeo, en este caso el de hasta arriba. El movimiento inicial de este es hacia la varilla auxiliar. El disco nmero dos por regla, se debe mover a la varilla nmero tres. Luego; el disco uno se mueve a la varilla tres para que quede sobre el disco dos. A continuacin se mueve el disco que sigue de la varilla uno, en este caso el disco nmero tres, y se coloca en la varilla dos. Finalmente el disco nmero uno regresa de la varilla tres a la uno (sin pasar por la dos) y as sucesivamente. Es decir, el truco est en el disco ms pequeo.
Mediante Recursividad.
Este problema se suele plantear a menudo en mbitos de programacin, especialmente para explicar la recursividad. Si numeramos los discos desde 1 hasta n, y llamamos X a la primera pila de discos (origen), Z a la tercera (destino) e Y a la intermedia (auxiliar) y a la funcin le llamaramos hanoi (origen, auxiliar, destino), como parmetros, la funcin recibira las pilas de discos. El algoritmo de la funcin sera el siguiente:
1. Si origen == {0}: mover el disco 1 de pila origen a la pila destino (insertarlo arriba de la pila destino); terminar. 2. Si no: hanoi({0...n-1},destino, auxiliar) //mover todas las fichas menos la ms grande (n) a la varilla auxiliar 3. mover disco n a destino //mover la ficha grande hasta la varilla final 4. hanoi (auxiliar, origen, destino) //mover todas las fichas restantes, {0...n-1}, encima de la ficha grande (n) 5. terminar
Palndromos Un palndromo es una cadena que se lee (se escribe, en este caso) igual de izquierda a derecha que de derecha a izquierda. Escribir una funcin que determine cuando una cadena es o no un palndromo.
Solucin
esttica bool palindrome (Cad c, int limIzq, int limDer) si limIzq > limDer entonces regresa verdadero sino si c [limIzq] = c [limDer] entonces regresa palindrome (c, limIzq+1, limDer-1) sino regresa falso fin
22
Caso base: Fib (0)=0; Fib (1)=1 Caso recursivo: Fib (i) = Fib (i -1) + Fib(i -2)
public static int fib(int n){ if (n <= 1) return n; //condicin base else return fib(n-1)+fib(n-2); //condicin recursiva }
23
return
Fib(2)
Fib(1) return 1
return 0
iteraciones recursividad
10
20
30
40
50
60
EJEMPLO: FACTORIAL
import javax.swing.*; public class Factorial { public static void main (String [] args) { String n=""; int fac=1,i=1,num; n=JOptionPane.showInputDialog("Ingrese un numero"); num=Integer.parseInt(n); if (num==0||num==1){ System.out.print("El facrotial de "+num+"es"+fac); } else { if (num>1) { while(num>=i) { fac=fac*i; i++; } System.out.print("El factorial es "+fac); } else{ System.out.print("Error numero tiene que ser mayor o igual a cero"); } } }
}