Capítulo 2: Recursividad.
|
|
|
- Concepción Espejo Córdoba
- hace 9 años
- Vistas:
Transcripción
1 Capítulo 2: Recursividad Introducción. La recursividad consiste en realizar una definición de un concepto en términos del propio concepto que se está definiendo. Ejemplos: Los números naturales se pueden definir de la siguiente forma: 0 es un Número natural y el sucesor de un número natural es también un número natural. El factorial de un número natural n, es 1 si dicho número es 0, o n multiplicado por el factorial del número n-1, en caso contrario. La n-ésima potencia de un número x, es 1 si n es igual a 0, o el producto de x por la potencia (n-1)-ésima de x, cuando n es mayor que 0. En todos estos ejemplos se utiliza el concepto definido en la propia definición.
2 Solución de problemas recursivos: División sucesiva del problema original en uno o varios más pequeños, del mismo tipo que el inicial. Se van resolviendo estos problemas más sencillos. Con las soluciones de éstos se construyen las soluciones de los problemas más complejos. O lo que es lo mismo: 1.Un problema P se puede resolver conociendo la solución de otro problema Q que es del mismo tipo que P, pero más pequeño. 2.Igualmente, supongamos que pudiéramos resolver Q mediante la búsqueda de la solución de otro nuevo problema, R, que sigue siendo del mismo tipo que Q y P, pero de un tamaño menor que ambos. 3.Si el problema R fuera tan simple que su solución es obvia o directa, entonces, dado que sabemos la solución de R, procederíamos a resolver Q y, una vez resuelto, finalmente se obtendría la solución definitiva al primer problema, P.
3 Ejemplos simples de recursividad. A) Cálculo del factorial de un número, por ejemplo, 5. 5! = 5 * 4! 4! = 4 * 3! 3!= 3 * 2! DESCOMPOSICIÓN DEL PROBLEMA 2! = 2 * 1! 1! = 1 * 0! SOLUCIÓN CONOCIDA O DIRECTA 0! = 1 5! = 5 * 4! = 120 2! = 2 * 1! = 2 1! = 1 * 0! = 1 3! = 3 * 2! = 6 RESOLUCIÓN DE PROBLEMAS MÁS COMPLEJOS A PARTIR 4! = 4 * 3! = 24 DE OTROS MÁS SIMPLES B) Búsqueda de una palabra en un diccionario.
4 Características de los problemas que pueden ser resueltos de manera recursiva: 4.Los problemas pueden ser redefinidos en términos de uno o más subproblemas, idénticos en naturaleza al problema original, pero de alguna forma menores en tamaño. 5.Uno o más subproblemas tienen solución directa o conocida, no recursiva. 6.Aplicando la redefinición del problema en términos de problemas más pequeños, dicho problema se reduce sucesivamente a los subproblemas cuyas soluciones se conocen directamente. 7.La solución a los problemas más simples se utiliza para construir la solución al problema inicial.
5 Algoritmos recursivos: diseño de la solución de un problema de manera recursiva El algoritmo se llamará a sí mismo varias veces Ojo al diseñar algoritmos recursivos! pueden ser menos eficientes que que su solución iterativa Algoritmo recursivo Implementación en un lenguaje de alto nivel que permita recursividad (en nuestro caso, en Java).
6 2.2.- Diseño de módulos recursivos. Módulo M con una llamada a sí mismo: módulo recursivo directo. Módulo M con una llamada a otro F, que hace una llamada a M: Módulo recursivo indirecto. Ejemplo: Implementación del factorial de un número. public long factorial (long n) if (n == 0) return 1; else return n * factorial(n-1); Dos partes principales: 8.La llamada recursiva, que expresa el problema original en términos de otro más pequeño, y 9.el valor para el cual se conoce una solución no recursiva. Esto es lo que se conoce como caso base: una instancia del problema cuya solución no requiere de llamadas recursivas.
7 El caso base 10.Actúa como condición de finalización de la función recursiva. Sin el caso base la rutina recursiva se llamaría indefinidamente y no finalizaría nunca. 11.Es el cimiento sobre el cual se construirá la solución completa al problema. Ejemplo: Traza del factorial de 5.
8 Búsqueda de soluciones recursivas: cuatro preguntas básicas. [P1] Cómo se puede definir el problema en términos de uno o más problemas más pequeños del mismo tipo que el original? [P2] Qué instancias del problema harán de caso base? [P3] Conforme el problema se reduce de tamaño se alcanzará el caso base? [P4] Cómo se usa la solución del caso base para construir una solución correcta al problema original?
9 Ejemplo: la sucesión de Fibonacci. 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,... El tercer término de la sucesión se obtiene sumando el segundo y el primero. El cuarto, a partir de la suma del tercero y el segundo. El problema: calcular el valor del n-ésimo término de la solución, que se obtendrá sumando los términos n-1 y n-2. Las respuestas a la preguntas anteriores serían: [P1] fibonacci(n) = fibonacci(n-1) + fibonacci(n-2). [P2] Casos bases: fibonacci(1) = 1 y fibonacci(2)=1. [P3] En cada llamada a la rutina fibonacci se reduce el tamaño del problema en uno o en dos, por lo que siempre se alcanzará uno de los dos casos bases. [P4] fibonacci(3) = fibonacci(2) + fibonacci(1) = Se construye la solución del problema n==2 a partir de los dos casos bases.
10 int fibonacci(int n) if ((n == 1) (n == 2)) return 1; else return (fibonacci(n-2) + fibonacci(n-1)); Peculiaridades de esta función recursiva: más de un caso base y más de una llamada recursiva (recursión no lineal).
11 Ejemplo: máximo común divisor de dos números m y n. Ejemplo de problema en el que la solución al encontrar el caso base es la propia solución del problema. Algoritmo de Euclides: Si n divide a m, entonces MCD(m, n)=n, Si no, MCD(m, n) = MCD(n, m % n), Soluciones a las cuatro preguntas: [P1] Es evidente que MCD(m, n) ha sido definida en términos de un problema del mismo tipo, pero justifiquemos que MCD(m, n % m) es de tamaño menor que MCD(m, n): 12.El rango de m % n es 0,..., n-1, por tanto el resto es siempre menor que n. 13.Si m > n, entonces MCD(n, m % n) es menor que MCD(m, n). 14.Si n > m, el resto de dividir m entre n es m, por lo que la primera llamada recursiva es MCD(n, m mod n) es equivalente a MCD(n, m), lo que tiene el efecto de intercambiar los argumentos y producir el caso anterior.
12 [P2] Si n divide a m, si y sólo si, m mod n = 0, en cuyo caso MCD(m, n) = n, por tanto, se conseguirá el caso base cuando el resto sea cero. [P3] Se alcanzará el caso base ya que n se hace más pequeño en cada llamada y además se cumple que 0 * m mod n * n-1. [P4] En este caso, cuando se llega al caso base es cuando se obtiene la solución final al problema, por lo que no se construye la solución general en base a soluciones de problemas más simples. public int mcd (int m, int n) if (m % n == 0) return n; else return (mcd(n, m % n));
13 Ejemplo: conteo de ocurrencias de un valor en un vector. Dado un vector de n enteros, el problema a resolver recursivamente consiste en contar el número de veces que un valor dado aparece en dicho vector. Respuestas: [P1] Si el primer elemento = valor buscado, entonces la solución será 1 más el número de veces que aparece dicho valor en el resto del vector. Si no, la solución al problema original será el número de veces que el valor se encuentra en las posiciones restantes [P2] El vector a está vacío =>ocurrencias en el vector= 0. [P3] Cada llamada recursiva se reduce en uno el tamaño del vector, por lo que nos aseguramos que en N llamadas habremos alcanzado el caso base. [P4] Cuando se encuentra una coincidencia se suma uno al valor devuelto por otra llamada recursiva. El retorno del control de las sucesivas llamadas comenzará inicialmente sumando 0 cuando nos hayamos salido de las dimensiones del vector. Función en Java que implementa la solución recursiva:
14 Parámetros: el tamaño del vector (n), el propio vector (vector), el valor a buscar (objetivo) y el índice del primer elemento del vector a procesar (primero). public int contarocurrencias (int n, int[] vector, int objetivo, int primero) if (primero > n-1) return 0; else if (vector[primero] == objetivo) return(1+contarocurrencias(n,vector,objetivo,primero+ 1)); else return(contarocurrencias(n,vector, objetivo, primero+1));
15 Ejemplo: combinaciones sin repetición de n objetos tomados de k en k. Cuántas combinaciones de k elementos se pueden hacer de entre un total de n (combinaciones sin repetición de n elementos tomados de k en k). Respuestas: [P1] El cálculo del número de combinaciones de n elementos tomados de k en k se puede descomponer en dos problemas: a) calcular el número de combinaciones de n-1 elementos tomados de k en k y b) el número de combinaciones de n-1 elementos tomados de k-1 en k-1. El resultado del problema inicial: ncsr(n, k) = ncsr(n- 1, k-1) + ncsr(n-1, k).
16 n personas y queremos determinar cuántos grupos de k personas se pueden formar de entre éstas. 4 personas (A, B, C y D), grupos de 2 ncsr(4,2)=ncsr(3,1)+ ncsr(3,2)? Suma de: los grupos que se pueden hacer de un tamaño k sin contar a la persona A: ncsr(n-1,k) :número de comités que se pueden hacer, de tamaño 2, pero sin A ncsr(3,2): B,C, B,D y D,C. los grupos que se puedan realizar incluyendo a esa misma persona, ncsr(n-1, k-1): ncsr(3,1): B, C y D.(contamos todos los que se pueden hacer con una persona menos y luego le añadimos esa persona). Solución final: = 6
17 [P2] Casos bases: Si k > n, entonces ncsr(n,k) =0 (no hay elementos suficientes). Si k = 0, entonces este caso sólo ocurre una vez (ncsr(n,0)=1). Si k = n, entonces ncsr(n,n)=1. [P3] 1ª llamada recursiva: restamos uno al número de elementos, y en la 2ª, al número de elementos y al tamaño de la combinación. [P4] Apenas se haya encontrado un caso base, uno de los sumandos tendrá un valor. Cuando el otro sumando alcance a un caso base, se podrá hacer la suma y se devolverá a un valor que irá construyendo la solución final conforme se produzcan las devoluciones de control. public int ncsr(int n, int k) if (k > n) return 0; else if (n == k k == 0) return 1; else return ncsr(n-1, k) + ncsr(n-1, k-1);
18 2.3.- La pila del ordenador y la recursividad. La memoria de un ordenador a la hora de ejecutar un programa queda dividida en dos partes: la zona donde se almacena el código del programa y la zona donde se guardan los datos: pila (utilizada para llamadas recursivas). Programa principal llama a una rutina M, se crea en la pila de un registro de activación o entorno, E almacena constantes, variables locales y parámetros formales. Estos registros se van apilando conforme se llaman sucesivamente desde una función a otras Cuando finaliza la ejecución, se va liberando el espacio
19 Profundidad de la recursión: número de registros de activación en la pila en un momento dado. Problema: Si profundidad es muy grande => desbordamiento pila. Representación gráfica del registro de activación:
20 Ejemplo de evolución de la pila: impresión de palabras en sentido contrario al leído. Función recursiva: imp_ordeninverso. Parámetros: número de palabras que quedan por leer (n). Respuestas: 1. [P1] Se lee la primera palabra, y recursivamente se llama a la función para que lea e imprima el resto de palabras, para que finalmente se imprima la primera leída. 2. [P2] El caso base: cuando sólo quede una palabra (n == 1), en cuyo caso se imprimirá directamente. 3. [P3] Como en cada llamada recursiva hay que leer una palabra menos del total, en n-1 llamadas se habrá alcanzado el caso base. 4. [P4] Una vez se haya alcanzado el caso base al devolver continuamente el control a las funciones invocantes se irán imprimiendo de atrás a delante las palabras obtenidas desde la entrada estándar.
21 public void imp_ordeninverso(int n) String palabra; if (n == 1) palabra =Console.in.readln(); System.out.println(palabra); else palabra =Console.in.readln(); imp_ordeninverso(n-1); System.out.println(palabra);
22
23 !OJO! Corrección de los casos base como forma de evitar una recursión infinita, y por tanto, que la pila se agote: 1. Cada rutina recursiva requiere como mínimo un caso base. 2. Se debe identificar todos los casos base ya que en caso contrario se puede producir recursión infinita. 3. Los casos bases deben ser correctos: las sentencias ejecutadas cuando se dé un caso base deben originar una solución correcta para una instancia particular del problema. En caso contrario, se generará una solución incorrecta. 4. Hay que asegurarse que cada subproblema esté más cercano a algún caso base.
24 2.4.- Paso de parámetros a los módulos recursivos. Utilización de parámetros formales: cuidado al decidir si los parámetros serán de entrada, salida o entrada/salida. Veamos un ejemplo: public long factorial (long n) if (n == 0) return 1; else n = n -1; return (n+1) * factorial(n); Qué ocurre cuando se empiezan a devolver las llamadas recursivas? n siempre será igual a 0, y se devolverá siempre 1 El factorial de cualquier número será 0 (INCORRECTO)
25 long fact, tamanio= 3; fact= factorial(tamanio); fact= factorial(n == 3) (n == 2) * factorial (n == 2) (n == 1) *factorial(n == 1) (n==0)*factorial(n==0) return 1. return (n+1==1) * 1 = 1 return (n+1==1) * 1= 1 return (n+1==1) * 1= 1 fact= 1 Regla general para decidir si un parámetro será pasado por copia o por referencia es la siguiente: si se necesita recordar el valor que tenía un parámetro una vez que se ha producido la vuelta atrás de la recursividad, entonces ha de pasarse por valor. En caso contrario, se podrá pasar por referencia. public void factorial (Long n, Long fact) if (n.longvalue() == 0) fact=new Long(1); else factorial(new Long(n.longValue()-1), fact); fact=new Long(fact.longValue()*n.longValue());
26 OJO! Cuidado con el número y tipo de parámetros formales de una función recursiva. Incorrecto: public int funcion ( int[] vector, int objetivo, int primero) Correcto: public int funcion (int n, int[] vector, int objetivo, int primero) Soluciones: 1. Declarar algunas variables como globales. 2. Hacer pasos por referencia. 3. Crear una función y dentro de ella implementar la función recursiva (la primera recubrirá a la segunda). PARA EVITAR EFECTOS SECUNDARIOS SÓLO SE PERMITIRÁ LA SEGUNDA DE ESTAS OPCIONES.
27 Algunas reglas generales para el paso de parámetros: Generalmente pasar por copia los parámetros necesarios para determinar si se ha alcanzado el caso base. Si la rutina acumula valores en alguna variable o vector, ésta debe ser pasada por referencia. Cualquier cambio en dicho vector se repercutirá en el resto de llamadas recursivas posteriores. Los vectores y las estructuras de datos grandes se pasarán por referencia y para evitar que se puedan modificar de manera errónea, se utilizará la palabra reservada const.
28 2.5.- Recursividad o iteración? La propia definición inherente recursiva de un problema no significa que sea más eficiente que una solución iterativa. Dos aspectos que influyen en la ineficiencia de algunas soluciones recursivas: El tiempo asociado con la llamada a las rutinas es una cuestión a tener en cuenta: Merece la pena la facilidad de elaboración del algoritmo con respecto al costo en tiempo de ejecución que incrementará la gestión de la pila originado por el gran número de posibles llamadas recursivas? La ineficiencia inherente de algunos algoritmos recursivos. Por ejemplo, en la solución fibonacci, la mayoría de los cálculos se repiten varias veces. Solución: Evitar procesamientos duplicado mediante la utilización de un vector o una lista, que mantuviera toda la información calculada hasta el momento.
29 Otro problema: el tamaño del problema a ser resuelto recursivamente. Si este implica una profundidad de recursión muy grande, olvidarla Eliminación de la recursividad. Cuando los lenguajes no lo permitan. La solución recursiva sea muy costosa. a) Eliminación de la recursión de cola. Recursión de cola: cuando existe una llamada recursiva en un módulo que es la última instrucción de una rutina Eliminar la recursión de cola: if (condición) Ejecutar una tarea. Actualizar condiciones. Llamada recursiva. El paso a estructura iterativa es inmediato, ya que es equivalente a un ciclo while: while (condición) Ejecutar una tarea. Actualizar condiciones.
30 Ejemplo: solución al problema de las Torres de Hanoi. public void torreshanoi(int n; char de; char hacia; char usando) if (n==1) System.out.println( Moviendo disco 1 en +de+ a +hacia); else if (n>1) torreshanoi(n-1, de, usando, hacia); System.out.println( Moviendo +n+ en +de+ al + hacia); torreshanoi(n-1, usando,hacia, de); Sustituir la última llamada torreshanoi() por las asignaciones correspondientes para que los parámetros actuales tengan los valores con los que se hacía esta llamada. public void torreshanoi(int n, char de, char hacia, char usando) char temp; while (n>1) torreshanoi(n-1, de, usando, hacia); System.out.println ( Moviendo + n + desde + de + al +hacia); n=n-1; temp= de; d= usando; usando= temp;
31 if (n==1) System.out.println( Moviendo 1 en +de+ al +hacia);
32 !!""# $%& $%& ' ' ()!!""# $%& $$ & ' '
33 b) Eliminación de la recursión mediante la utilización de pilas. Llamada a una rutina: se introducen en la pila los valores de las variables locales, la dirección de la siguiente instrucción a ejecutar una vez que finalice la llamada, se asignan los parámetros actuales a los formales y se comienza la ejecución por la primera instrucción de la rutina llamada. Finalización de la rutina: se saca de la pila la dirección de retorno y los valores de las variables locales, se ejecuta la siguiente instrucción.
34 En esta técnica de eliminación de recursividad: el programador implementa una estructura de datos con la que simulará la pila del ordenador, introducirá los valores de las variables locales y parámetros en la pila, en lugar de hacer las llamadas recursivas, los sacará para comprobar si se cumplen los casos bases. Se añade un bucle, generalmente while, que iterará mientras la pila no esté vacía, hecho que significa que se han finalizado las llamadas recursivas.
35 Ejemplo: eliminación de la recursividad de la función ncsr: public int ncsr(int n, int k) if (k > n) return 0; else if ((n == k) (k == 0)) return 1; else return ncsr(n-1, k) + ncsr(n-1, k-1); public int ncsr_nr(int n, int k) tpila pila; int suma=0; pila=crear(); push(n, pila); push(k, pila); while (!vacia(pila)) k= tope(pila); pop(pila); n= tope(pila); pop(pila); if (k >n ) suma += 0; else if (k == n k== 0) suma +=1; else push(n-1, pila); push(k-1, pila); push(n-1, pila); push(k, pila); destruir(pila); return suma;
36 De manera general, dada una estructura recursiva básica de la forma: rutinarecursiva(parámetros) Si se han alcanzado los casos basesentonces Acciones que correspondan a dichos casos bases. Si no Llamada recursiva con los parámetros correspondientes. La estructura básica de la eliminación de la recursividad es la siguiente: rutinanorecursiva(parámetros) Meter los parámetros y variables locales en la pila. Repetir mientras no esté vacía la pila Sacar los elementos que están en el tope de la pila Si éstos cumplen los casos bases Entonces Acciones que correspondan a dichos casos bases. Si no Meter en la pila los valores con los que se produciría la(s) llamada(s) recursiva(s). OJO! Tantas pilas como tipos de parámetros y variables locales.
37 2.7.- Algunas técnicas de resolución de problemas basadas en la recursividad Divide y vencerás. Si el tamaño n del problema < umbral dado entonces aplicar un algoritmo sencillo para resolverlo o encontrar la solución directa. si no dividir el problema de en m subproblemas y encontrar la solución a cada uno de ellos. Combinar las soluciones de los m problemas para obtener la solución final. Ejemplo: búsqueda binaria de un valor en un vector. Si el elemento buscado está en la posición que ocupa la mitad del vector, concluir la búsqueda. Si no es así, determinar en qué mitad debería estar el elemento: si fuera <= que el valor de la mitad buscar en la mitad izquierda, y si fuera mayor, en la parte derecha.
38 Cuándo acabaríamos? el valor buscado es encontrado, o cuando el tamaño del vector sea cero, lo que indica que no está el valor buscado. public int busqbinaria(int vector [], int liminf, int limsup, int valor) int mitad; if (liminf > limsup) return -1; else mitad= (liminf + limsup)/2; if (valor == vector[mitad]) return mitad; else if (valor <= vector[mitad]) return busqbinaria(vector, liminf, mitad-1, valor); else return busqbinaria(vector, mitad+1, limsup,valor);
39 Ejemplo: Las torres de Hanoi. Utilizando tres postes (A, B y C) y n discos de diferentes tamaños y con un agujero en sus mitades para que pudieran meterse en los postes, y considerando que un disco sólo puede situarse en un poste encima de uno de tamaño mayor, el problema consistía en pasarlos, de uno en uno, del poste A, donde estaban inicialmente colocados, al poste B, utilizando como poste auxiliar el restante (C), cumpliendo siempre la restricción de que un disco mayor no se pueda situar encima de otro menor.
40 Solución: Para un disco: moverlo de A a B. Para más de un disco: Solventar el problema para n-1 discos, ignorando el último de ellos, pero ahora teniendo en cuenta que el poste destino será C y B será el auxiliar Una vez hecho esto anterior, los n - 1 discos estarán en C y el más grande permanecerá en A. Por tanto, tendríamos el problema cuando n = 1, en cuyo caso se movería ese disco de A a B Por último, nos queda mover los n-1 discos de C a B, utilizando A como poste auxiliar. public void torreshanoi(int numdiscos, char origen, char destino, char auxiliar) if (numdiscos == 1) Sytem.out.println("Mover el disco de arriba del poste + origen+ al + destino); else torreshanoi(numdiscos-1, origen, auxiliar, destino); torreshanoi(1, origen, destino, auxiliar); torreshanoi(numdiscos-1, auxiliar, destino, origen);
41 Backtracking. Ejemplo: el problema de las ocho reinas Un tablero de ajedrez, el cual tiene un total de 64 casillas (8 filas x 8 columnas). El problema consiste en situar ocho reinas en el tablero de tal forma que no se den jaque entre ellas. Una reina puede dar jaque a aquellas reinas que se sitúen en la misma fila, columna o diagonal en la que se encuentra dicha reina. R R R R R R R R
42 Solución: Meter la primera reina. Meter la segunda en una casilla que no esté atacada por la primera reina. Meter la tercera en una casilla no atacada por la primera o la segunda. Meter sucesivamente el resto de reinas. Si en algún momento no puede colocarse una reina, ir deshaciendo movimientos de las reinas ya colocadas y a partir de esa reorganización continuar la colocación del resto de reinas. Funciones auxiliares: void asignarreinaa(int fila, int columa) => Sitúa un 1 en la casilla (Fila, Columna) indicando que está ocupada por una reina. void eliminarreinade(int fila, int columna) => Sitúa un 0 en la casilla (Fila, Columna) indicando que esa casilla está libre (antes estaba ocupada por una reina y ahora deja de estarlo). int recibejaqueen(int fila, int columna) => Devuelve 1 si la casilla (Fila, Columna) recibe jaque de alguna reina y 0 en caso contrario.
43 public void situarreina(int Columna) /* Col indica en qué columna se quiere situar la reina, y Situada es una variable que tomará el valor 1 cuando se haya logrado ubicar correctamente a la reina correspondiente, y 0 cuando el intento haya sido infructuoso. */ int fila, situada; if (columna > 7) situada=1; return Situada; else situada=0; fila=1; while (!(situada) && (fila <= 7)) if (fecibejaqueen(fila, columna)) ++fila; else asignarreinaa(fila, columna); situada=situarreina(columna+1); if (!(Situada)) eliminareinade(fila, columna); ++fila; return situada;
44
Capítulo 2: Recursividad
Capítulo 2: Recursividad 2.1 Introducción a la recursividad. La recursividad es una técnica ampliamente utilizada en matemáticas, y que básicamente consiste en realizar una definición de un concepto en
Tema 7: Recursividad
Tema 7: Recursividad Objetivos: en este tema estudiaremos funciones recursivas; esto es, funciones que se invocan a sí mismas. Estas funciones son equivalentes a estructuras tipo bucle pero permiten especificar
4.1 Definición. Se dice que algo es recursivo si se define en función de sí mismo o a sí mismo. Un objeto (problemas, estructuras de datos) es
Recursividad 4.1 Definición. Se dice que algo es recursivo si se define en función de sí mismo o a sí mismo. Un objeto (problemas, estructuras de datos) es recursivo si forma parte de sí mismo o interviene
Recursividad Definición
Recursividad Definición Un procedimiento o función se dice recursivo si durante su ejecución se invoca directa o indirectamente a sí mismo. Esta invocación depende al menos de una condición que actúa como
Tema 4.- Recursión e iteración
UNIVERSIDAD DE CÓRDOBA ESCUELA POLITÉCNICA SUPERIOR DE CÓRDOBA DEPARTAMENTO DE INFORMÁTICA Y ANÁLISIS NUMÉRICO PROGRAMACIÓN DECLARATIVA INGENIERÍA INFORMÁTICA ESPECIALIDAD DE COMPUTACIÓN CUARTO CURSO PRIMER
Programación II Recursividad Dr. Mario Rossainz López
5. RECURSIVIDAD 5.1. Introducción La recursividad es una técnica en la que una función o método se hace llamadas a sí misma en el proceso de la realización de sus tareas. La recursividad da al programador
Introducción Algoritmos de tipo dividir para vencer Algoritmos de rastreo Inverso. Recursividad. Programación Avanzada. 8 de septiembre de 2017
Recursividad Programación Avanzada 8 de septiembre de 2017 Contenido Introducción Objetivos Definición y características Caso de análisis: factorial Contenido Introducción Objetivos Definición y características
Estructura de Datos. Recursividad. Primer Semestre, Indice
Estructura de Datos Recursividad Prof.: Mauricio Solar Prof.: Lorna Figueroa Primer Semestre, 2 Indice Introducción Definición Condiciones para la Recursividad Tipos de Recursividad Aplicaciones Ejemplo
Complejidad de algoritmos recursivos
Tema 3. Complejidad de algoritmos recursivos 1. INTRODUCCIÓN... 1 CLASIFICACIÓN DE FUNCIONES RECURSIVAS... 1 DISEÑO DE FUNCIONES RECURSIVAS... 2 2. VENTAJAS E INCONVENIENTES DE LA RECURSIVIDAD... 4 3.
Metodología de la Programación II. Recursividad
Metodología de la Programación II Recursividad Objetivos Entender el concepto de recursividad. Conocer los fundamentos del diseño de algoritmos recursivos. Comprender la ejecución de algoritmos recursivos.
Programación I Recursividad.
Programación I Recursividad http://proguno.unsl.edu.ar [email protected] Recursividad Técnica de resolución de problemas particulares. La definición de un concepto es recursiva si el concepto es definido
UNIDAD 7 Recursividad Concepto. Algoritmos recursivos. Seguimiento de la recursión. Algunos métodos recursivos de búsqueda y ordenación: M-Sort y
Recursividad Concepto. Algoritmos recursivos. Seguimiento de la recursión. Algunos métodos recursivos de búsqueda y ordenación: M-Sort y Q-Sort. Comparación de eficiencia en métodos Iterativos vs recursivos
Recursividad. 1.1 Concepto de Recursividad. Objetivos. Metodología de la Programación II Entender el concepto de recursividad.
Objetivos Metodología de la Programación II Entender el concepto de recursividad. Conocer los fundamentos del diseño de algoritmos recursivos. Recursividad Comprender la ejecución de algoritmos recursivos.
La recursividad forma parte del repertorio para resolver problemas en Computación y es de los métodos más poderosos y usados.
RECURSIVIDAD La recursividad forma parte del repertorio para resolver problemas en Computación y es de los métodos más poderosos y usados. Los algoritmos recursivos ofrecen soluciones estructuradas, modulares
UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO.
UNIVERSIDAD DE LOS ANDES NUCLEO UNIVERSITARIO RAFAEL RANGEL (NURR) DEPARTAMENTO DE FISICA Y MATEMATICA AREA COMPUTACION TRUJILLO EDO. TRUJILLO Recursividad: La recursividad es una técnica de programación
Luis Rodríguez Baena Universidad Pontificia de Salamanca Escuela Superior de Ingeniería y Arquitectura
Fundamentos de Programación II Tema 3. Recursividad Luis Rodríguez Baena ([email protected]) Universidad Pontificia de Salamanca Escuela Superior de Ingeniería y Arquitectura Naturaleza de la recursividad
Tema 5- Diseño Recursivo y. Objetivos Principales. Bibliografía Básica
Tema 5- Diseño Recursivo y Eficiente Tema 5- Diseño Recursivo y Eficiente Germán Moltó Escuela Técnica Superior de Ingeniería Informática Universidad Politécnica de Valencia Índice general: 1. Introducción
Recursividad. Dept. Ciencias de la Computación e I.A. Universidad de Granada
TEMA Recursividad Dept. Ciencias de la Computación e I.A. Universidad de Granada Índice Introducción a la recursión Recursividad frente a iteración Eficiencia de los algoritmos recursivos Ejemplos y ejercicios
ESTRUCTURA DE DATOS: Tema 3. Recursividad
ESTRUCTURA DE DATOS: Tema 3. Recursividad Presenta: David Martínez Torres Universidad Tecnológica de la Mixteca Instituto de Computación Oficina No. 37 [email protected] Contenido 1. Directa e indirecta
Análisis de algoritmos. Recursividad
Análisis de algoritmos Recursividad 1 Matrushka La Matrushka es una artesanía tradicional rusa. Es una muñeca de madera que contiene otra muñeca más pequeña dentro de sí. Ésta muñeca, también contiene
TEMA 1. Recursividad. Recursividad CONTENIDO DEL TEMA
TEMA 1 Recursividad Recursividad T E M A 1 CONTENIDO DEL TEMA 1.- Introducción. 2.- Verificación de funciones y procedimientos recursivos 3.- Escritura de programas recursivos 4.- Ejemplos. 5.- Recursión
Programación 2. Lección 3. Introducción a la recursividad
Programación 2 Lección 3. Introducción a la recursividad 1 1. Definiciones recursivas Número natural y número entero Múltiplos de 7 Secuencia de datos Factorial de un número natural Sucesión de Fibonacci
Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos
Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos 1! 1. Algoritmos recursivos " 1.1 Algoritmos recursivos. Recursión simple " 1.2 Algoritmos con vuelta atrás y ejemplos! 2. Complejidad de
ESTRUCTURA DE DATOS: Tema 3. Recursividad
ESTRUCTURA DE DATOS: Tema 3. Recursividad Presenta: David Martínez Torres Universidad Tecnológica de la Mixteca Instituto de Computación Oficina No. 37 [email protected] Contenido 1. Directa e indirecta
suma de los n>0 primeros números que se lean del teclado. El número n es un dato y es
EJERCICIOS.. 1. Escribe un algoritmo que usando un bucle for infinito, y una sentencia break calcule la suma de los n>0 primeros números que se lean del teclado. El número n es un dato y es el primero
Tema 9. Recursividad
Tema 9. Recursividad http://aulavirtual.uji.es José M. Badía, Begoña Martínez, Antonio Morales y José M. Sanchiz {badia, bmartine, morales, [email protected] Estructuras de datos y de la información Universitat
RECURRENCIA RECURSIÓN o RECURSIVIDAD
RECURRENCIA RECURSIÓN o RECURSIVIDAD 1 Definición Definición de diccionario Recursividad: Véase Recursividad 2 Definición Técnica que para resolver problemas basándose en la propia definición del mismo
RECURSIVIDAD. Prof. Ing. M.Sc. Fulbia Torres
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
Universidad de Valladolid. Departamento de informática. Campus de Segovia. Estructura de datos Tema 1: Recursividad. Prof. Montserrat Serrano Montero
Universidad de Valladolid Departamento de informática Campus de Segovia Estructura de datos Tema 1: Recursividad Prof. Montserrat Serrano Montero ÍNDICE Conceptos básicos Ejemplos recursivos Recursividad
Estructura de datos y de la información Boletín de problemas - Tema 9
Estructura de datos y de la información Boletín de problemas - Tema 9 1. Dada la siguiente función recursiva: void F(char c) { if (( A
TECNICAS DE PROGRAMACION Universidad Católica Los Angeles de Chimbote RECURSIVIDAD Y SOBRECARGA DE METODOS
RECURSIVIDAD Y SOBRECARGA DE METODOS RECURSIVIDAD Un método es recursivo cuando se llama a si mismo ya sea directamente e indirectamente. Si un método recursivo se invoca con un caso base, simplemente
Algoritmos y Estructuras de Datos: Introducción a la Recursión de Programas. Guillermo Román Díez
Algoritmos y Estructuras de Datos: Introducción a la Recursión de Programas Guillermo Román Díez [email protected] Universidad Politécnica de Madrid Curso 2015-2016 Guillermo Román, UPM AED: Introducción
Tema 3. Recursividad.
Tema 3. Recursividad. E.U. Politécnica Departamento Lenguajes y Ciencias de la Computación. Universidad de Málaga José Luis Leiva Olivencia. Despacho: I-326D (Edificio E.U.P)/ 3.2.41 (Teatinos-E.T.S.I.I.)
Tema: Funciones, Procedimientos y Recursividad en C#.
2 Programación I Programación I. Guía 6 3 Facultad: Ingeniería Escuela: Ingeniería en Computación Asignatura: Programación I Tema: Funciones, Procedimientos y Recursividad en C#. Objetivos Utilizar la
Práctica 5.- Recursividad
Benemérita Universidad Autónoma de Puebla Facultad de Ciencias de la Computación Programación Avanzada en Java Prim. 2009 Práctica 5.- Recursividad Datos de la práctica Fecha 6 de marzo de 2009 Conceptos
Recursión. Introducción a la Computación Clase 15 Patricia Borensztejn
Recursión Introducción a la Computación Clase 15 Patricia Borensztejn El concepto de la recursión Recursión, recurrencia o recursividad es la forma en la cual se especifica un proceso basado en su propia
Estructuras de Repetición
1 Estructuras de Repetición 2013 Transversal de Programación Básica Proyecto Curricular de Ingeniería de Sistemas 2 Objetivos Aprender a construir grandes y complejos problemas a través de la ejecución
Tema: Funciones, Procedimientos y Recursividad en C#.
Tema: Funciones, Procedimientos y Recursividad en C#. Objetivos Programación I, Guía 6 1 Utilizar la sintaxis de las funciones definidas por el usuario (programador) para resolver problemas. Identificar
Tema: Funciones, Procedimientos y Recursividad en C#.
Tema: Funciones, Procedimientos y Recursividad en C#. Objetivos Programación I, Guía 7 1 Facultad: Ingeniería Escuela: Ingeniería en Computación Asignatura: Programación I Utilizar la sintaxis de las funciones
Tema: Funciones, Procedimientos y Recursividad en C#.
Programación I, Guía 6 1 Tema: Funciones, Procedimientos y Recursividad en C#. Objetivos Utilizar la sintaxis de las funciones definidas por el usuario (programador) para resolver problemas. Identificar
Ejercicios sobre recursividad
Ejercicios sobre recursividad 11 de febrero de 2003 1. Implementa una función recursiva que devuelva la suma de los dígitos de un número natural, que se le pasa por parámetro. 2. Implementa una función
Recursión. Capítulo 4
Recursión Capítulo 4 Introducción La recursión o recursividad es un concepto amplio, con muchas variantes, y difícil de precisar con pocas palabras.. Actividades Cotidianas; fotografía donde se observa
Algorítmica y Lenguajes de Programación. Algoritmos voraces y divide y vencerás
Algorítmica y Lenguajes de Programación Algoritmos voraces y divide y vencerás Algoritmos voraces. Introducción (i) Las personas glotonas (voraces) intentan coger tanto como pueden en cada momento. Los
EJEMPLO DE PARTIDA. Pongo en la casilla: 4 El tablero queda como: X
El objetivo de este ejercicio es crear un programa que juegue a tres en raya contra un oponente humano. Tras cada movimiento el programa debe mostrar el tablero y permitir mover al humano. El programa
Recursividad. Definición. Diseño de Algoritmos Recursivos
Recursividad Definición Un procedimiento o función se dice recursivo si durante su ejecución se invoca directa o indirectamente a sí mismo. Esta invocación depende al menos de una condición que actúa como
Trabajo Práctico Nº 06
Tema: Recursividad 1. Dado el siguiente método: static int puzle (int base, int limite) if (base > limite) return -1; if (base = = limite) return base * puzle(base+1,limite); 1.1 Identificar: a) el caso(s)
Pilas Motivación
Capítulo 4 Pilas Las pilas son estructuras muy sencillas y poderosas, también conocidas como LIFO (last in, first out) por la forma en que se trabaja con ellas. Ejemplo de ellas son las pilas de charolas
Departamento de Informática Universidad de Valladolid Campus de Segovia TEMA 1: RECURSIÓN
Departamento de Informática Universidad de Valladolid Campus de Segovia TEMA 1: RECURSIÓN ÍNDICE Definición Conceptos básicos Ejemplos recursivos Recursión mútua Recursión e iteración DEFINICIÓN Técnica
Programación de sistemas Recursión
Programación de sistemas Recursión Departamento de Ingeniería Telemática 1 Contenidos Recursión Tipos de recursión Recursión vs. iteración 2 Recursión Proceso por el cual un método se llama a sí mismo
1. Una pila funciona según el método LIFO (Last In First Out ). Se define la clase Pila de la siguiente forma:
Facultad de Ingeniería Establecimiento Público de Educación Superior, adscrito al Departamento de Antioquia Lógica de Programación II Taller Nº 3: Pilas, colas y recursividad Período 02 de 2014 Profesor:
M.C. Yolanada Moyao Martínez
M.C. Yolanada Moyao Martínez Es una técnica de programación que permite que un bloque de instrucciones se ejecute n veces. En Java los métodos pueden llamarse a sí mismos. Si dentro de un método existe
Qué es la recursividad?
Recursividad 1 Ejemplo Matrushka La Matrushka es una artesanía tradicional rusa. Es una muñeca de madera que contiene otra muñeca más pequeña dentro de sí. Esta muñeca, también contiene otra muñeca dentro.
5. ESTRUCTURAS DE REPETICIÓN
5. ESTRUCTURAS DE REPETICIÓN Las estructuras de repetición, permiten la ejecución de una lista o secuencia de instrucciones () en varias ocasiones. El número de veces que el bloque
Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso º Grado en Informática
Relación de prácticas de la asignatura METODOLOGÍA DE LA PROGRAMACIÓN Segundo Cuatrimestre Curso 2016-2017 1º Grado en Informática Práctica 3: Recursividad, Ficheros y Argumentos en Línea de órdenes Objetivos
Temario. Tipos de recursión. Eficiencia y recursión
RECURSION Temario Tipos de recursión Eficiencia y recursión Tipos de RECURSION Según desde donde se realice el llamado recursivo: Directa: la función se llama a sí misma. Indirecta: la función A llama
Programación 1 Tema 5. Instrucciones simples y estructuradas
Programación 1 Tema 5 Instrucciones simples y estructuradas Índice Instrucciones simples Instrucciones estructuradas 2 Instrucción ::= 3 Instrucciones.
Programación Orientada a Objetos Métodos Guía de Ejercicios v9.7
Programación Orientada a Objetos Métodos Guía de Ejercicios v9.7 1, Escriba un método llamado puntoscalidad que reciba como entrada el promedio de un estudiante y devuelva 4 si el promedio se encuentra
Técnicas de prueba y corrección de algoritmos
Técnicas de prueba y corrección de algoritmos Diseño y Análisis de Algoritmos Cátedra de Programación Carrera de Ingeniería de Sistemas Prof. Isabel Besembel Carrera Algoritmos recursivos Aparente circularidad
Sentencias iterativas
Sentencias iterativas 1. Objetivos Al finalizar esta actividad, serás capaz de: 1. Utilizar adecuadamente la sentencia while para generar la repetición en la ejecución de grupos de sentencias 2. Motivación
Tema 3. Estructuras de control
Tema 3. Estructuras de control 3.1. Secuencial 3.2. Selección 3.3. Repetición 2 Objetivos Objetivos del tema: Conocer y saber la utilidad de las tres estructuras de control (secuencial, alternativa y repetitiva)
Algoritmos y Estructuras de Datos Curso 06/07. Ejercicios
6.1.(Clase) Un programa que utiliza la técnica divide y vencerás, divide un problema de tamaño n en a subproblemas de tamaño n/b. El tiempo g(n) de la resolución directa (caso base) se considerará constante.
Metodología y Tecnología de la Programación
Tema 4. Abstracción procedimental y de datos 1. Cuál es el error del siguiente programa? import java.util.scanner; class Respuesta{ static Scanner leer=new Scanner(System.in); int valor = lectura(); System.out.println(valor);
TEMA 5: Subprogramas, programación modular
TEMA 5: Subprogramas, programación modular 5.1.-Definición de módulo. Programación modular La programación modular está basada en la técnica de diseño descendente, que como ya vimos consiste en dividir
Estructuras de Datos y de la Información Ingeniería Técnica en Informática de Gestión. Curso 2007/2008 Ejercicios del Tema 2
Estructuras de Datos y de la Información Ingeniería Técnica en Informática de Gestión. Curso 2007/2008 Ejercicios del Tema 2 Diseño de algoritmos recursivos 1. Dado un vector de enteros de longitud N,
Recursividad. Franco Guidi Polanco Escuela de Ingeniería Industrial Pontificia Universidad Católica de Valparaíso, Chile
Recursividad Franco Guidi Polanco Escuela de Ingeniería Industrial Pontificia Universidad Católica de Valparaíso, Chile [email protected] Recursividad v Es la técnica de definir un proceso en términos de si
ANÁLISIS Y DISEÑO DE ALGORITMOS. PRACTICAS
ANÁLISIS Y DISEÑO DE ALGORITMOS. PRACTICAS 2004-2005 PRACTICA 1: MEDICIÓN DEL TIEMPO. ALGORITMOS DE ORDENACIÓN Crear un conjunto de funciones que permitan la medición del tiempo de ejecución de los programas,
Unidad 2 Recursividad. 2.1 Definición 2.2 Procedimientos Recursivos 2.3 Ejemplos de Casos Recursivos
Unidad 2 Recursividad 2.1 Definición 2.2 Procedimientos Recursivos 2.3 Ejemplos de Casos Recursivos 2.1 Definición de Recursividad La Recursividad es una técnica de programación muy poderosa usada ampliamente
Concepto de Recursión. Características de algoritmos recursivos. Ejemplos
RECURSION Temario Concepto de Recursión Características de algoritmos recursivos Ejemplos RECURSION Metodologías para resolver problemas: 1. Diseño Top Down 2. Recursión 3. Abstracción de Datos 4. Diseño
Programación de sistemas
Programación de sistemas Recursión Julio Villena Román MATERIALES BASADOS EN EL TRABAJO DE DIFERENTES AUTORES: Carlos Delgado Kloos, Carlos Alario Hoyos 1 Contenidos Recursión Tipos
Tecnología de la Programación
Título de Grado en Ingeniería Informática Curso 2009/10 Fernando Jiménez Barrionuevo Gracia Sánchez Carpena Mari Carmen Garrido Carrera Departamento de Ingeniería de la Información de las Comunicaciones
Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos
Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos 1! 1. Algoritmos recursivos " 1.1 Algoritmos recursivos. Recursión simple " 1.2 Algoritmos con vuelta atrás y ejemplos! 2. Complejidad de
OCW-V.Muto Sistemas de numeración Cap. III CAPITULO III. SISTEMAS DE NUMERACION 1. REPRESENTACION DE LA INFORMACION
CAPITULO III. SISTEMAS DE NUMERACION 1. REPRESENTACION DE LA INFORMACION El sistema de numeración usado habitualmente es el decimal, de base 10, que no es adecuado para ser manejado por el ordenador, fundamentalmente
Ejercicios Tema 6. Funciones
Ejercicios Tema 6. Funciones 1. Programa que calcule el cuadrado de todos los números comprendidos entre dos dados. Usar una función a la que se le pasa como parámetro un valor y retorna su cuadrado. 2.
Subrutinas. Subrutinas. Erwin Meza Vega
Subrutinas Erwin Meza Vega Outline 1 Introducción 2 Especicación de subrutinas 3 Funciones booleanas 4 Parámetros 5 Recursividad 6 Ejercicios Introducción Programación divide y vencerás Cuando la solución
Funciones Tipos de funciones y Recursividad
Funciones Tipos de funciones y Recursividad SESION 4 Definición Una función es una subrutina o subprograma que forman un programa que realiza tareas bien definidas. Todo programa en C consta de una o más
PROGRAMACION ESTRUCTURADA: Tema 3. Funciones
PROGRAMACION ESTRUCTURADA: Tema 3. Funciones Presenta: David Martínez Torres Universidad Tecnológica de la Mixteca Instituto de Computación Oficina No. 37 [email protected] Contenido 1. Definiciones
Dra. Jessica Andrea Carballido
Dra. Jessica Andrea Carballido [email protected] Dpto. de Ciencias e Ingeniería de la Computación UNIVERSIDAD NACIONAL DEL SUR Problema Diseño de la solución Dividir y conquistar Implementación de los
Diseño y Análisis de Algoritmos
1. Recursividad 2. "Dividir para Reinar" 3. Recursividad y Tabulación (Programación Dinámica) 4. Métodos Matemáticos Funciones discretas Notación O Ecuaciones de recurrencia 5. Casos de Estudio Breve descripción
Primer Cuatrimestre 2018 Resolución de Problemas y Algoritmos
Lenguaje de Diseño Primer Cuatrimestre 2018 Resolución de Problemas y Algoritmos 1 Programación Modular Programación Estructurada Programas fáciles de leer y modificar Técnicas de Diseños Dividir y Conquistar
Unidad 2 Recursividad. 2.1 Definición 2.2 Procedimientos Recursivos 2.3 Ejemplos de Casos Recursivos
Unidad 2 Recursividad 2.1 Definición 2.2 Procedimientos Recursivos 2.3 Ejemplos de Casos Recursivos 2.1 Definición de Recursividad La Recursividad es una técnica de programación muy poderosa usada ampliamente
CAPITULO 6: FUNCIONES
CAPITULO 6: FUNCIONES 1. INTRODUCCIÓN Un problema de programación en C se resuelve descomponiéndolo en varias partes. Cada una de estas partes se puede asociar a una función que resuelva su fracción correspondiente
Capítulo 4. Control de flujo. Continuar
Capítulo 4 Control de flujo Continuar Introducción El control de flujo permite encausar a la computadora sobre la ruta que debe seguir al momento de la ejecución de un programa, para ello se apoya en las
for(i = 0; i <= 45; i+=5) { x = (i*3.1416)/180; printf( seno(%d) = %f\n,i,seno(x));
Ejemplo #include #include float seno(float x); int main(){ int i; float x; for(i = 0; i
Divide & Conquer. Herman Schinca. Clase de Junio de 2011
Divide & Conquer Herman Schinca Clase 20 7 de Junio de 2011 Divide y vencerás Idea aplicable a muchas situaciones de la vida. Origen histórico atribuído a Julio César en relación a sus estrategias militares.
