ESTRUCTURAS DE DATOS 2006 Prof.
UNIDAD II ESTRUCTURAS DE DATOS RECURSIVIDAD Definición. Estado base. Estado general. Ejemplos. Ejercicios.
DEFINICIÓN Es una técnica de programación muy potente que permite definir un objeto (problemas, estructuras de datos) en términos de si mismo.
DEFINICIÓN Ejemplo: Un subprograma que se llame a si mismo se dice que es recursivo. En estos se dan de dos maneras: DIRECTO: El subprograma se llama directamente a si mismo. Subprograma P Instrucción 1 Instrucción 2 Instrucción 3 Llamada a P
DEFINICIÓN INDIRECTA: El subprograma llama a otro subprograma y éste a su vez llama al primero. Subprograma P Llamada a Q Subprograma Q Llamada a V Subprograma V Se ejecuta termina
En toda definición recursiva de un problema se debe establecer lo siguiente: Estado Base: un estado en el cual la solución no se presenta de manera recursiva sino directamente. Además la entrada (datos) del problema debe ir acercándose al estado básico. Este estado se denomina salida de la recursión, y es necesario que exista por lo menos una dentro de cada rutina recursiva, para garantizar que el proceso termina. Estado General: llamada recursiva, y también es necesaria la presencia de al menos uno de éstos en toda rutina recursiva.
Metodología de desarrollo Buscar las salidas de la recursión: en que casos o bajo qué circustancias se puede dar una respuesta inmediata al problema planteado. Determinar los avances de la recursión: en que casos se debe plantear la respuesta en términos de una llamada recursiva. Para esto es conveniente: Identificar los casos posibles, Definir que significa un problema con la misma estructura pero menor tamaño y plantear la llamada recursiva, y Explicar en cada caso la manera de construir la respuesta a partir del retorno de dicha llamada. Escribir el algoritmo que implementa el planteamiento antes logrado.
El factorial de un número entero positivo n se define como el producto de los números comprendidos entre 1 y n, la expresión n! simboliza el factorial de n. Escribir una función recursiva para encontrar el factorial de un número n. Hacer el análisis y el planteamiento del problema.
0! = 1 4! = 4(4 1) = 4 * 3! 1! = 1 3! = 3(3 1) = 3 * 2! 2! = 2 * 1 2! = 2(2 1) = 2 * 1! 31 = 3 * 2 * 1 1! = 1 4! = 4 * 3 * 2 * 1 llamadas recursivas. 2! = 2 * 1! = 2 * 1 = 2. 3! = 3 * 2! = 3 * 2 = 6 n! = n(n 1)! 4! = 4 * 3! = 4 * 6 = 24
Análisis: Entradas: entero n. Salidas: factorial de n. Planteamiento: Fact (n) 1 si n=0 o n=1 Estado Base n * Fact(n 1) si n > 1 Estado General
int Fact ( int n ) { If (n == 0 n == 1) return 1; else return (n * Fact(n 1)); }
Gráficamente: Fact (4) = 24 4 * Fact(3) = 24 4 * 6 6 3 * Fact(2) = 6 3 * 2 2 2 * Fact(1) = 2 2 * 1 1 1 * Fact (0) = 1 1 * 1 1 1
Escribir una función recursiva para encontrar la suma de los enteros pares hasta N. Suma pares = 2+4+..+(N-2)+N. Hacer el análisis y el planteamiento del problema.
Análisis: Entradas: entero par N. Salidas: suma de los enteros pares hasta N. Planteamiento: 2 + 4 + 6 + 8 +...+(N - 2) + N Sumapares(N) N si N=2 Estado Base N + sumapares(n-2) si N > 2 Estado General.
int sumapares ( int N ) { If (N == 2) return (N); else if (N > 2) if (N % 2 == 0) return (N + asumapares(n-2)); else exit (1); }
Corrida gráfica: N=8 sumapares(8) = 8 + sumapares(6) sumapares(6) = 6 + sumapares(4) sumapares(4) = 4 + sumapares(2) sumapares(2) = 2
Escribir una función recursiva para calcular cuantas combinaciones de tamaño Miembros pueden hacerse del tamaño total Grupo C: número total de combinaciones Grupo: tamaño total del grupo del que elegir Miembros: tamaño de cada subgrupo Grupo>=Miembros Hacer el análisis y el planteamiento del problema.
Análisis: Entradas: Grupo, Miembros. Salidas: Combinaciones. Planteamiento: Grupo si Miembros==1 ESTADO BASE C(Grupo,Miembros) 1 si Miembros==Grupo. C(Grupo-1,Miembros-1)+C(Grupo-1,Miembros) si Grupo>Miembros>1 ESTADO GENERAL
ALGORITMO EN Comb(EN Grupo, Miembros) VAR EN cmb INICIO SI Miembros == 1 ENTONCES cmb = Grupo (*Caso Base 1*) SINO SI Miembros == Grupo ENTONCES cmb = 1 (*Caso Base 2*) SINO (*Caso General*) cmb = Comb(Grupo-1,Miembros-1) + Comb(Grupo-1,Miembros) DEVOLVER cmb FIN. Llamada : Escribir( Número de combinaciones=, Comb(20,5))
int Comb(int Grupo, Miembros) { int cmb; If (Miembros == 1) cmb = Grupo (*Caso Base 1*) else if (Miembros == Grupo) cmb = 1 (*Caso Base 2*) else (*Caso General*) cmb = Comb(Grupo-1,Miembros-1) + Comb(Grupo-1,Miembros) return (cmb); }
Seguimiento Comb(4,3) Comb(4,3) Comb(3,2) + Comb(3,3) Comb(2,1) + Comb(2,2) 1 2 + 1 + 1 =4
GRACIAS POR SU ATENCIÓN HASTA LA PRÓXIMA CLASE