4 Recursividad. Contenido. 4. Recursividad Definición y Tipos de recursividad

Tamaño: px
Comenzar la demostración a partir de la página:

Download "4 Recursividad. Contenido. 4. Recursividad Definición y Tipos de recursividad"

Transcripción

1 4 Recursividad Programación Modular. ETSIT. 1 o C, Apuntes del profesor Juan Falgueras 2004 Contenido 4. Recursividad Definición y Tipos de recursividad La recursión es como la iteración Tipos de recursión Implementación interna en un ordenador Verificación de la corrección de un algoritmo recursivo Conveniencia del uso de la recursividad Ejemplos de programas recursivos La función de Fibonacci Dígitos binarios La búsqueda binaria Quicksort Torres de Hanoi Ackerman Búsqueda binaria Algoritmos de vuelta atrás Recursividad Hasta ahora hemos visto formas de estructurar tanto datos como programas, mediante funciones. Las funciones resuelven cometidos concretos y llevan parámetros que las hacen ser útiles para distintas situaciones. Las funciones que hemos visto hasta ahora se resolvían por sí mismas o, a lo sumo podían pedir ayuda otras funciones que terminaban resolviéndose sin más llamadas. Sin embargo, hay veces en que una función sólo se puede resolver volviéndose a llamar a sí mismas. Se trata de funciones recursivas. Cuándo tiene esto sentido? En este tema se introduce el concepto de recursión, se examinan los posibles casos, se muestra cómo un ordenador, que es fundamentalmente iterativo, no recursivo, puede emular la recursión; se dan reglas para comprobar que las solucines recursivas que se construyan tengan final y se presentan diversos ejemplos importantes de recursión Definición y Tipos de recursividad Se dice que un proceso es recursivo si se resulve llamándose a sí mismo. Para que la recursión tenga sentido (un final útil) cada vez que se llame internamente a sí misma deberá hacerlo de una manera menos recursiva hasta que finalmente se llame a sí misma de una manera no recursiva. La recursión infinita es inútil. Lo único que determina el comportamiento de una función son los parámetros que son los que dan idea del tamaño del problema. La función no es recursiva para algunos valores del parámetro que se denominan casos base. Toda función recursiva, pues, debe tener algún caso base y toda llamada recursiva dentro de ella debe tender hacia el caso base.

2 4.1 Definición y Tipos de recursividad La recursión es como la iteración En muchas ocasiones se puede ver que la recursión no es más que la repetición (iteración) de una serie de acciones. Esta iteración se da hasta llegar a un valor de una variable. Pero en la recursión esta iteración se está desarrollando mediante la llamada de la función a sí misma con un parámetro que es la variable que determina el final de la recursión, en vez de ser un bucle dentro de una función normal. Así pues, en la iteración, es la guarda del bucle la que determina cuándo acabará la repetición; en la recursión es el parámetro. Por ejemplo: { 1 x = 0 = x f(x 1) x > 0 es una definición formal de la función factorial en forma recursiva. que podría corresponder al algoritmo recursivo: 1 int f(int n) { 2 if (0==n) 3 return 1; 4 else 5 return n * f(n-1); 6 } pero también sabemos que la forma iterativa de factorial es: = x (x 1) (x 2)... 1 que está definida mediante una repetición de multiplicaciones empezando en el propio valor x y en las que el siguiente multiplicador disminuye hasta llegar al valor 1. El algoritmo sería: 1 int f(int x) { 2 int r, i; 4 for (i=x, r=1; i>1; --i) 5 r *= i; 6 return r; 7 } En este sentido la recursividad es una nueva forma de ver las acciones repetitivas permitiendo que un subprograma se llame a sí mismo para resolver una versión más pequeña del problema original. Sin embargo, no siempre la recursión es tan similar a la iteración Tipos de recursión Estructuralemente existen dos formas de recursión: 1. la directa: es la que hemos visto hasta ahora en la que la función se llama a sí misma. 2. Indirecta: es la recursión que se produce cuando la función se llama no a sí misma sino a otra función (y esta quizás a otra) que termina llamándo a la función inicial. Se produce así una cadena: f(a) g(b) h(c)... f(a ) Así la recursión directa es una forma más simple de recursión en la que no existen g(), h(), etc. Existen distintos modos de hacer la recursión: de cabeza la recursión de cabeza se produce cuando la llamada recursiva se hace justo al principio del procedimiento recursivo, antes que ninguna otra operación. Por ejemplo:

3 4.1 Definición y Tipos de recursividad 3 directa final x x''' x'' indirecta final x x? x' Figura 1: En la recursión directa, la función se llama a sí misma; en la indirecta llama a otras que terminan llamándola de nuevo a ella. 1 char ultimaletra(char *cadena) 2 { 3 if (*cadena!= \0 ) { 4 return ultimaletra(cadena+1); 5 } 6 } de cola por el contrario, en la de cola la llamada se hace al final después de todas las operaciones. intermedia implica la existencia de operaciones antes y después de la llamada recursiva. múltiple se producen varias llamadas, recursivas en distintos puntos del procedimiento. anidada la anidada o no primitiva es aquella en la que la recursión se produce en un parámetro de la propia llamada recursiva. Es decir, al hacer la llamada recursiva se utiliza un parámetro que es el resultado de una llamada recursiva. x' x' x' f(x') A B C A B C A B C A B C Figura 2: Dependiendo del momento del desarrollo del algoritmo en el que se produce la recursión se tienen cuatro formas, en general Implementación interna en un ordenador Consideremos ahora la ejecución de la función recursiva. En un lenguaje de programación, cuando se llama a un procedimiento (o función), lo que se hace es que se guarda la dirección de la sentencia llamante como dirección de retorno; se asigna nueva memoria para las variables locales del procedimiento, y al finalizar la ejecución del procedimiento, se libera la memoria asignada a las variables locales y se vuelve la ejecución al punto en que se hizo la llamada haciendo uso de la dirección de retorno, dirección de la instrucción que sigue a la instrucción de llamada al procedimiento. Por otro lado, tenemos que estudiar dos conceptos más. Uno es la pila (stack) y el otro son los registros de activación de los procedimientos. Una pila es una estructura de datos en la que sólo cabe añadir o quitar un dato cada vez, pero, tal y como se hace con una pila de libros, por ejemplo, para el dato a extraer sólo es accesible el último libro que se apiló. Debido a este comportamiento a las pilas también se las conoce como estructuras último que entra, primero que sale (LIFO).

4 4.2 Verificación de la corrección de un algoritmo recursivo 4 return addr (x) int i; Figura 3: La pila de recursión se va formando en cada llamada dejando encima los datos de la última llamada para ser los inmediatamente pendientes de resolver. El registro de activación de un procedimiento es un bloque de memoria que contiene información sobre las constantes, variables locales declaradas en el procedimiento y los parámetros que se le pasen en esa llamada al procedimiento, junto con la dirección de retorno que corresponde a esa llamada. Los lenguajes de programación actuales utilizan una pila especial que el sistema tiene para las llamadas a subrutinas. En esta pila el código máquina del programa cada vez que tiene que llamar a un procedimiento guarda su registro de activación. Si dentro de esta subrutina se llama de nuevo a sí misma en forma recurrente, dado que la creación del registro de activación del propio procedimiento se hace sobre una pila sin borrar los registros de activación anteriores, se puede generar uno nuevo para cada llamada recursiva. Al final nos encontramos con que con cada llamada recursiva se están apilando registros de activación sobre los registros de activación de las llamadas anteriores. Cuando una de las llamadas recursivas se resuelve por fin sin recursión, su registro de activación se quita de la pila (se desapila) siguiendo la ejecución del programa por dónde iba cuando se llamó esta última vez. Y por tanto siguiendo también con las variables y parámetros que se tenían en aquél momento. De nuevo, cuando esta llamada se resuelve sin recursión, se repite la disminución de la pila y vuelta al estado anterior. Debido a la sobrecarga (overhead) que producen las operaciones sobre la pila, la creación y borrado de los registros de activación, los procedimientos recursivos consumen más tiempo y memoria que los programas no recursivos. Sólo en determinadas ocasiones, debido a la estructura de datos usada en el problema o al planteamiento del mismo la recursión es preferible, y evitar la recursión es bastante más difícil que dar una solución recursiva al problema Verificación de la corrección de un algoritmo recursivo Para comprobar que un algoritmo recursivo funciona correctamente es necesario que siga las tres reglas siguientes: 1. Existe un caso base (por cada llamada recursiva que se haga dentro del algoritmo debe haber un valor) para el cual el algoritmo finalice sin recursión. Por ejemplo, fact(0) = 0 sin recursión. En el algoritmo factorial se produce una llamada recursiva con lo cual es suficiente con un caso base. 2. Todos los posibles argumentos de las llamadas recursivas se reenvían tendiendo sus valores hacia un caso base. En el caso del factorial, ya que la llamada recursiva que se hace es con fact(n-1) y n se suponía natural, tienden para valores de n > 0 al valor La función es correcta, para valores distintos del caso base. En el caso del factorial, por inducción, tendríamos que si fact(n) = n!, entonces fact(n + 1) = n fact(n) = (n + 1)!

5 4.3 Conveniencia del uso de la recursividad 5. En general la búsqueda de una solución recursiva de los algoritmos se facilita mediante la localización de los casos bases. Una vez respondidos a ellos, se trata de que el argumento en general tienda a estos valores Conveniencia del uso de la recursividad La recursión debería de evitarse siempre que se pueda por motivos de eficiencia, como se ha visto en el apartado Sin embargo, sería justificable emplearla cuando: 1. se sabe que la función no va a generar demasiada profundidad de llamadas recursivas; particularmante por que la pila del sistema donde se guardan todos las variables locales y parámetros, es relativamente pequeña y podría colapsar el sistema. 2. se sabe que la función no va a utilizar estructuras de datos locales demasiado grandes. Si así fuese el caso, aunque la solución se mantuviese como recursiva habría que recurrir a otra forma de mantener los datos. 3. cada llamada no genera a su vez llamadas ya resueltas en otras llamadas que se generarán o se han generado antes. Este problema hay que analizarlo antes y es frecuente en recursión. Es una fuente de ineficiencia usual en recursión el que una función se evalúe múltiples veces con el mismo valor de parámetro en las llamadas recursivas generadas internamente, 4. La solución no es planteable de forma sencilla de otra manera. Ocurre en muchos casos que la forma recursiva es muy más clara que la iterativa, como se verá en los ejemplos. En otras palabras, si la forma iterativa está ahí y es sencilla, es preferible Ejemplos de programas recursivos La función de Fibonacci fib(x) = { 1 x 2 fib(x 2) + fib(x 2) x > 2 La función de Fibonacci proviene del bucólico problema de la multiplicación de conejos. Supongamos que partimos de una pareja de conejos recién nacidos, y queremos calcular cuántas parejas de conejos forman la familia al cabo de n meses si: Los conejos nunca mueren. Un conejo puede reproducirse al comienzo del tercer mes de vida. Los conejos siempre nacen en parejas macho-hembra. Al comienzo de cada mes, cada pareja macho-hembra, sexualmente madura, se reproduce en exactamente un par de conejos machohembra. Para un n pequeño, por ejemplo 6, la solución se puede obtener fácilmente a mano: Mes 1: 1 pareja, la inicial Mes 2: 1 pareja, ya que todavía no es sexualmente madura. Mes 3: 2 parejas; la original y una pareja de hijos suyos. Mes 4: 3 parejas; la original, una pareja de hijos suyos nacidos ahora y la pareja de hijos suyos nacidos en el mes anterior. Mes 5: 5 parejas; la original, una pareja de hijos suyos nacidos ahora, las dos parejas nacidas en los meses 3 y 4, y una pareja de hijos de la pareja nacida en el mes 3.

6 4.4 Ejemplos de programas recursivos 6 Mes 6: 8 parejas; las 5 del mes anterior, una pareja de hijos de la original, una pareja de hijos de la nacida en el mes 3 y una pareja de hijos nacida en el mes 4. Si deseamos saber el número de parejas al cabo de n meses, para un n cualquiera, podemos construir un algoritmo recursivo fácilmente a partir de la siguiente relación: { 1 n 2 Parejas(n) = Parejas(n 1) + Parejas(n 2) n > 2 En esta relación Parejas(n 1) son las parejas vivas en el mes n 1, y Parejas(n 2) son las parejas que nacen en el mes n a partir de las que había en el mes n 2. La serie de números Parejas(1), Parejas(2), Parejas(3),... es conocida como la Serie de Fibonacci, la cual modela muchos fenómenos naturales. El crecimiento de esta función, como demuestra la su aproximación: y(k) 1/ 5( ) k, es exponencial. Los valores de y k coinciden (en su parte entera redondeada desde k = 1 con los de f(k)). 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1.597, 2.584, 4.181, 6.765, , , , , , , , , , , , son sólo los valores alcanzado hasta el término 30. En forma de algoritmo recursivo la función de Fibonacci sería: 1 int fib(int n) { 2 if (n<=2) 3 return 1; 4 else 5 return fib(n-1)+fib(n-2); 6 } es un ejemplo de sencillez y falta de eficiencia recursiva, como se vé en el árbol de recursión de la misma (Fig. 4). f(5) f(6) f(4) f(4) f(3) f(2) f(3) f(3) f(2) f(2) f(1) f(2) f(1) f(2) f(1) Figura 4: Árbol de recursión del algoritmo recursivo Fibonacci. Obsérverse la cantidad de llamadas repetidas que se producen sólo para calcular el sexto valor de la serie. Matemáticamente los números de la serie de Fibonacci aparecen en muchas ocasiones. Una expresión cerrada (no recurrente) para calcularlos es: ( fib(n) = 1 (1 + 5 ) n ( ) 1 5 ) n = φn φ n siendo φ = (1 + 5)/2 y φ = (1 5)/2 el número aúreo. Fibonacci crece exponencialmente ya que el término que resta es menor que 1 (φ ) mientras que φ El número de dígitos del n-simo término crece rápidamente, de manera lineal con n.

7 4.4 Ejemplos de programas recursivos 7 Programación dinámica del algoritmo recursivo de Fibonacci. El problema de la solución recursiva de Fibonacci es que llama multitud de veces a los mismos cálculos que acaba de resolver. Para valores pequeños esto no tiene importancia, pero el crecimiento exponencial de este número de llamadas repetidas lo hacen realmente ineficiente respecto a una sencilla solución iterativa mediante un simple bucle. La Programación Dinámica consiste almacenar los valores que se van obteniendo durante el proceso completo como resultados parciales reaprovechables para subsiguientes cálculos, optimizando así el análisis global. En nuestro caso, bastaría con almacenar, conforme los calculamos, los valores de los fibs anteriores, de manera que cuando se pidan de nuevo esos valores se devuelvan directamente del almacén de los calculados. En el lenguaje de programación C, por ejemplo, se puede mantener la información calculada en variables locales de una llamada a otra mediante variables locales estáticas. En este caso, nos interesa mantener un largo array de valores calculados pero también, dado que tan sólo la primera vez necesitará este array inicializarse, una variable que nos diga si es la primera vez o no que ejecutamos la función. Quedaría: 1 unsigned fib(int n) { 2 static unsigned fibs[1000]; 3 static bool primeravez=true; // sólo se inicializa una vez 4 if (primeravez) { 5 fibs[1]=fibs[2]=1; 6 for(int i=3; i<1000; i++) 7 fibs[i] = 0; 8 primeravez = false; 9 } 10 if (fibs[n]!= 0) 11 return fibs[n]; 12 fibs[n] = fib(n-1) + fib(n-2); 13 return fibs[n]; 14 } Dígitos binarios El siguiente algoritmo recursivo escribe secuencialmente (y de manera ordenada) los dígitos binarios del parámetro entero que recibe: 1 typedef unsigned long int base; 2 void dec2bin(base n) { 3 if (n >= 2){ 4 dec2bin(n / 2); 5 cout << n % 2; 6 } else { 7 cout << n; 8 } 9 } Su especificación formal sería: 0 x = 0 dec2bin(x) = 1 x = 1 dec2bin(x/2) x %2 x 2 indicando la concatenación de cadenas de letras. La operación % sería la operación resto que devuelve el resto de la división entre sus operandos La búsqueda binaria Z BusquedaBin(E T a[n], E T x) requiere que el array esté ordenado. Para responder recursivamente podemos lanzar una función recursiva en la que acotemos los límites binarios de la búsqueda; lanzaríamos la primera llamada con 0, N 1:

8 4.4 Ejemplos de programas recursivos 8 1 int buscarr(t ordenado[], int ini, int fin, T x) { 2 int mitad; 4 if (ini > fin) 5 return -1; 7 mitad = (fin + ini) / 2; 8 if (ordenado[mitad] == x) 9 return mitad; 10 else if (x > ordenado[mitad]) 11 return Buscar(ordenado, mitad+1, fin, x); 12 else 13 return Buscar(ordenado, ini, mitad-1, x); 14 } 16 int BusquedaBin(T ordenado[], T x) 17 { 18 return buscarr(ordenado, 0, N-1, x); 19 } Quicksort El algoritmo de ordenación de Hoare (apodado Quicksort) es mucho más sencillo en forma recursiva. Cómo funciona? Se trata de separar en dos partes el array, a un lado los elementos más pequeños y al otro los más grandes (o iguales) a un elemento de referencia llamado pivote, que se toma del mismo array (ver la Figura 5). En esta división o partición está el secreto de Quicksort. Para que la cosa funcione bien, se debería elegir el pivote de manera que quedara más o menos en medio del array repartido. Una vez hecha esta partición podemos plantearnos recursivamente el mismo problema de ordenación pero con dos arrays la mitad de largos. Esto llevaría en el primer array a otros dos arrays también separados por un nuevo pivote y así sucesivamente. Lo interesante es que cada subarray mitad está ya en su sitio ( rápidamente ) desde el principio y, por ende, el array concatenación de todos ellos. 1 Para que el array quede dividido por la mitad en cada partición es necesario elegir muy bien el pivote o referencia. Para conseguir que el pivote quede enmedio, debería tomarse la mediana de los elementos del array. De hecho algunas versiones de este algoritmo de ordenación buscan esta mediana primero entre los elementos del array, pero este proceso hay que descartarlo en general ya que lo que se gana en cuanto a la simetría y eficiencia de las particiones se pierde en la búsqueda de la mediana de los subarrays, necesariamente búsquedas de complejidades lineales. Así pues, el pivote se elige al azar entre los elementos del array recibido. Al no haber criterio a priori se toma o bien el primero o bien el último, o, si se es supersticioso, el de enmedio. Tomando como referencia el último: x = a[n 1] Una vez tomado el pivote x empezamos la partición. Para ello el siguiente paso es localizar (desde 0 hasta i) un punto hasta el cual todos los elementos del array sean menores que el pivote x elegido. Se para la búsqueda y se deja allí una referencia i, asímismo se busca otro punto bajando desde el final del array (desde N 1 hasta j) hasta el cual todos los elementos del array sean mayores o iguales al pivote, sería j. Tenemos pues dos puntos posiblemente separados i y j que contienen valores desordenados, uno mayor (o igual) (en i) y otro menor que el pivote (en j). Se intercambian esos valores y se repite este proceso subiendo el valor del índice i y bajando el del j con el mismo criterio (de nuevo una vez localizados los nuevos i y j se intercambian sus contenidos) hasta que i j. 1 Una vez lograda esta división el problema inicialmente de complejidad cuadrática N 2 queda dividido en la suma de dos problemas de la cuarta parte de complejidad (N/2) 2. El resultado final (N/2) 2 + (N/2) 2 1/2N 2 es de menor complejidad que si se trata siempre con todo el array de golpe, como se hace en los métodos de intercambio directo (burbuja, selección o inserción), que manejan todo el array en cada operación.

9 4.4 Ejemplos de programas recursivos 9 En el punto i = p en el que se encontró un elemento mayor (o igual) que el pivote x se tienen aseguradas las condiciones: k < p, a[k] < x y k > p, a[k] x Después de esto, dado que el elemento que queda en p puede ser mayor que el pivote x que está situado en a[n 1], se intercambia por él, dejando el pivote en p y garantizando un array con dos partes a[0..p] < r y a[p + 1..N 1] r. Se tienen pues ahora problemas como el inicial pero < Figura 5: Tras cada iteración se han intercambiado los elementos de manera que quedan los menores a un lado y las mayores al otro del valor elegido de referencia. recursivamente más pequeños. Con lo cual se abordan llamadas recursivas a cada parte del array para ordenarlos igualmente. Mientras más iguales sean los tamaños de las partes menos llamadas recursivas surgirán. En este sentido se puede dar un caso degenerativo de este algoritmo que sería el de tener como tamaño de una de las partes un elemento cada vez (en la otra los restantes) y por lo tanto se produciéndose N 1 llamadas recursivas que sólo sacan cada vez un elemento fuera del array a ordenar. El caso es que precisamente esta situación degenerativa se da con cierta facilidad. Basta con que nos den un array ordenado o invertido para que ocurra este desastre. Lo mejor para que no ocurra es que los elementos estén aleatoriamente repartidos. Se han hecho infinidad de estudios y mejoras de este algoritmo (particularmente interesantes las iniciadas por Sedgewick), para tratar de paliar sus debilidades. Nótese que las grandes cualidades de este algoritmo son las de hacer pocos intercambios y además haciendo viajar a los elementos grandes distancias cada vez que se hacen, lo que constituye las dos grandes cualidades más buscadas de los algoritmos de ordenación. Un detalle más a su favor, mucho más a nivel técnico es que los bucles de recorrido que hacen el trabajo duro son especialmente fáciles de optimizar en cualquier procesador ya que involucran sólo dos punteros a bloques que se van incrementando/decrementando en el propio procesador. 1 int particion(char a[], int iz, int de) 2 { 3 char x, t; 4 int i, j; 6 x = a[de]; // pivote 7 i = iz - 1; 8 j = de; 9 do { 10 do ++i; while (a[i] < x); // x hace también de centinela 11 do --j; while (j >= 0 && a[j] >= x); 12 if (i<j) intercambia(a[i], a[j]); 13 } while (i < j); 14 intercambia(a[i], a[de]); // asegura x en su sitio 15 return i; 16 } 18 void quick(char a[], int iz, int de) 19 { 20 int p; 22 if (de > iz) {

10 4.4 Ejemplos de programas recursivos p = particion(a, iz, de); 24 quick(a, iz, p-1); 25 quick(a, p+1, de); 26 } 27 } 29 void QuickSort(char a[]) 30 { 31 quick(a, 0, strlen(a)-1); 32 } murcielago m(u)rciela(g)o -i-> m(g)rciela(u)o mg(r)ciel(a)uo -i-> mg(a)ciel(r)uo mgaciel(r)u(o) -p-> mgaciel(o)u(r) = [mgaciel]o[ur] (m)gaci(e)l our -i-> (e)gaci(m)l our egaci(m)(l) our -p-> egaci(l)(m) our = [egaci]l[m our] egac(i)(i) lm our -p-> egac(i)(i) lm our = [egac]i[lm our] (e)g(a)c ilm our -i-> (a)g(e)c ilm our a(g)e(c) ilm our -p-> a(c)e(g) ilm our = [a]c[eg ilm our] ace(g)(g) ilm our -p-> ace(g)(g) ilm our = [a c e]g[ilm our] a ceg ilm o(u)(r) -p-> acegilmo(r)(u) = [acegilmo]r[u] acegilmoru Cuadro 1: Ejemplo de pasos intermedios en la ordenación in situ de un array. Las -i-> son reordenaciones para repartir entre los dos subarrays. Las -p-> la reubicación del pivote.

11 4.4 Ejemplos de programas recursivos Torres de Hanoi Las Torres de Hanoi es un juego cuya solución se simplifica mucho si se piensa como un problema recursivo. Se tienen 3 palos de madera, que llamaremos palo izquierdo, central y derecho. El palo izquierdo tiene ensartados un montón de discos concéntricos de tamaño decreciente, de manera que el disco mayor está abajo y el menor arriba. El problema consiste en mover los discos del palo izquierdo al derecho respetando las siguientes reglas: Sólo se pueden mover los discos de un palo a otro. Sólo se puede mover un disco cada vez. No se puede poner un disco encima de otro más pequeño. Se quiere diseñar un programa que recibiendo un valor entero N y escriba la secuencia de pasos necesarios para resolver el problema de las torres de Hanoi para N discos. Solución Para ver el problema de forma recursiva tenemos que pensar que la solución para N = 1 es trivial, mientras que para un valor más alto de N se puede reducir en cada ocasión en un valor N 1, descomponiendo la solución en 3 fases: 1. Mover los N 1 discos superiores del palo izquierdo al palo central, utilizando el palo derecho como palo auxiliar. 2. Mover el disco que queda del palo izquierdo al derecho. 3. Mover los N 1 discos del palo central al palo derecho, utilizando el palo izquierdo como auxiliar. Si N = 1, el problema se resuelve inmediatamente sin más que mover el disco del palo izquierdo al derecho. Para representar estos pasos en el ordenador, planteamos un procedimiento recursivo que recibe cuatro parámetros: El número de discos a mover. El nombre del palo a tomar como origen desde donde moverlos. El nombre del palo a tomar como destino hacia el que moverlos. El nombre del palo a usar como auxiliar. 1 Algoritmo Mueve(N, origen, auxiliar, destino) 2 Inicio 3 SI N == 1 ENTONCES 4 Mueve un disco del palo origen al destino 5 EN OTRO CASO 6 Mueve(N-1, origen, destino, auxiliar) 7 Escribe("Mueve un disco del palo ", origen, " al ", destino) 8 Mueve(N-1, auxiliar, origen, destino) 9 FINSI 10 Fin

12 4.5 Algoritmos de vuelta atrás 12 origen auxiliar destino origen auxiliar destino Figura 6: Mover n discos se reduce a mover n 1 al palo libre, mover después el que queda al destino, y volver a plantear recursivamente el mover, pero ahora, n 1 discos Ackerman La función Ackerman se define: n + 1, m = 0 A(m, n) = A(m 1, 1), n = 0 A(m 1, A(m, n 1)), m, n > 0 función recursiva no primitiva (anidada) (en la que como argumento aparece una recursión). Probarla para A(1, 1), A(2, 1) Qué ocurre para valores de m 5? No tiene especial interés matemático sino que apareció como banco de pruebas de la capacidad de recursión para los ordenadores. De hecho para valores muy pequeños de n y m se producen profundos niveles de anidamiento recursivo imposibles para los ordenadores usuales Búsqueda binaria Si se busca binariamente un valor dentro de un array ordenado, podemos descartar la mitad en la que seguro que no está el valor y llamar recursivamente a la misma función con el subarray en la parte en la que puede estar. Se deja como ejercicio Algoritmos de vuelta atrás De entre los métodos de resolución algorítmica de problemas el método de vuelta atrás o de backtracking se caracteriza por plantear el mismo problema pero con la muestra de menor tamaño, por lo tanto, en forma recursiva. Muchos problemas de juegos de tablero se resuelven mediante backtracking. Por ejemplo, si se necesita conocer si un camino en un laberinto es solución, se trata de recorrer hasta el final, y si no se puede llegar, se vuelve a plantear el recorrido en una de las 7 tres direcciones restantes en el momento de partida. Se deja como ejercicio resolver el problema del salto del caballo recursivamente mediante la técnica de bactracking (Figura 7).

13 4.5 Algoritmos de vuelta atrás 13 Figura 7: Posibles movimientos de salto que puede realizar un caballo (no importaría que las celdas del camino estuviesen o no ya ocupadas). Se trataría de pasar por todas las N N casillas de un tablero. Juan Falgueras Dpto. Lenguajes y Ciencias de la Computación Universidad de Málaga Despacho

TEMA 1. Recursividad. Recursividad CONTENIDO DEL TEMA

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

Más detalles

Complejidad de algoritmos recursivos

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.

Más detalles

Recursividad. Contenido. 1. Concepto de recursividad. 2. Funcionamiento de la recursividad. 3. Uso de la recursividad. 4. Ejemplos.

Recursividad. Contenido. 1. Concepto de recursividad. 2. Funcionamiento de la recursividad. 3. Uso de la recursividad. 4. Ejemplos. 3 Recursividad Contenido 1. Concepto de recursividad. 2. Funcionamiento de la recursividad. 3. Uso de la recursividad. 4. Ejemplos. Diseño de Algoritmos. J.L.Leiva O. Página 1 1.- Concepto de recursividad.

Más detalles

Recursividad Definición

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

Más detalles

Análisis de algoritmos. Recursividad

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

Más detalles

Programación II Recursividad Dr. Mario Rossainz López

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

Más detalles

Programación I Recursividad.

Programación I Recursividad. Programación I Recursividad http://proguno.unsl.edu.ar proguno@unsl.edu.ar Recursividad Técnica de resolución de problemas particulares. La definición de un concepto es recursiva si el concepto es definido

Más detalles

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 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

Más detalles

Tema 7: Recursividad

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

Más detalles

Tema 9. Recursividad

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, sanchiz@icc.uji.es Estructuras de datos y de la información Universitat

Más detalles

Tema 4.- Recursión e iteración

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

Más detalles

Luis Rodríguez Baena Universidad Pontificia de Salamanca Escuela Superior de Ingeniería y Arquitectura

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 (luis.rodriguez@upsam.es) Universidad Pontificia de Salamanca Escuela Superior de Ingeniería y Arquitectura Naturaleza de la recursividad

Más detalles

Tema: Programación Dinámica.

Tema: Programación Dinámica. Programación IV. Guía No. 12 1 Facultad: Ingeniería Escuela: Computación Asignatura: Programación IV Tema: Programación Dinámica. Objetivos Específicos Definir el concepto de programación dinámica. Interpretar

Más detalles

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. 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

Más detalles

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 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

Más detalles

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 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

Más detalles

Tema 06: Recursividad

Tema 06: Recursividad Tema 06: Recursividad M. en C. Edgardo Adrián Franco Martínez http://www.eafranco.com edfrancom@ipn.mx @edfrancom edgardoadrianfrancom (Prof. Edgardo A. Franco) 1 Contenido Recursión Recursividad Programación

Más detalles

Tema: Programación Dinámica.

Tema: Programación Dinámica. Programación IV. Guía 11 1 Facultad: Ingeniería Escuela: Computación Asignatura: Programación IV Tema: Programación Dinámica. Objetivos Específicos Definir el concepto de programación dinámica. Interpretar

Más detalles

Algoritmos de Ordenación

Algoritmos de Ordenación Algoritmos de Ordenación Pedro Corcuera Dpto. Matemática Aplicada y Ciencias de la Computación Universidad de Cantabria corcuerp@unican.es Algoritmos comunes - Ordenación Ordenación o clasificación es

Más detalles

ESTRUCTURA DE DATOS: Tema 3. Recursividad

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 dtorres@mixteco.utm.mx Contenido 1. Directa e indirecta

Más detalles

Tema 5- Diseño Recursivo y. Objetivos Principales. Bibliografía Básica

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

Más detalles

Diseño y Análisis de Algoritmos

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

Más detalles

Algoritmos Iterativos de Búsqueda y Ordenación y sus tiempos

Algoritmos Iterativos de Búsqueda y Ordenación y sus tiempos Estructura de Datos y Algoritmos Algoritmos Iterativos de Búsqueda y Ordenación y sus tiempos 1. Algorimos de ordenación Discutiremos el problema de ordenar un array de elementos. A los efectos de simplificar

Más detalles

Tema 3. Análisis de costes

Tema 3. Análisis de costes Tema 3. Análisis de costes http://aulavirtual.uji.es José M. Badía, Begoña Martínez, Antonio Morales y José M. Sanchiz {badia, bmartine, morales, sanchiz}@icc.uji.es Estructuras de datos y de la información

Más detalles

UNIDAD 7 Recursividad Concepto. Algoritmos recursivos. Seguimiento de la recursión. Algunos métodos recursivos de búsqueda y ordenación: M-Sort y

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

Más detalles

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 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,

Más detalles

Ejercicios sobre recursividad

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

Más detalles

TEMA 5: Subprogramas, programación modular

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

Más detalles

Universidad de Valladolid. Departamento de informática. Campus de Segovia. Estructura de datos Tema 4: Ordenación. Prof. Montserrat Serrano Montero

Universidad de Valladolid. Departamento de informática. Campus de Segovia. Estructura de datos Tema 4: Ordenación. Prof. Montserrat Serrano Montero Universidad de Valladolid Departamento de informática Campus de Segovia Estructura de datos Tema 4: Ordenación Prof. Montserrat Serrano Montero ÍNDICE Conceptos básicos Elección de un método Métodos directos

Más detalles

Algoritmos y Estructuras de Datos Tema 2: Diseño de Algoritmos

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

Más detalles

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1

Agradecimientos. Nota de los autores. 1 Problemas, algoritmos y programas 1 Prologo Agradecimientos Nota de los autores Índice general I III V VII 1 Problemas, algoritmos y programas 1 1.1 Programas y la actividad de la programación.................... 4 1.2 Lenguajes y modelos

Más detalles

Estructura de datos y de la información Boletín de problemas - Tema 10

Estructura de datos y de la información Boletín de problemas - Tema 10 Estructura de datos y de la información Boletín de problemas - Tema 10 1. En el caso de que sea posible, dar un ejemplo de los siguientes puntos. Si no, explicar por qué no lo es. Considerar un valor genérico

Más detalles

Tema 9. Algoritmos sobre listas. Programación Programación - Tema 9: Algoritmos sobre listas

Tema 9. Algoritmos sobre listas. Programación Programación - Tema 9: Algoritmos sobre listas Tema 9 Algoritmos sobre listas Programación 2015-2016 Programación - Tema 9: Algoritmos sobre listas 1 Tema 9. Algoritmos sobre listas Algoritmos sobre Arrays. Búsqueda. Inserción. Ordenación. Programación

Más detalles

Capítulo 3 Algoritmos recursivos

Capítulo 3 Algoritmos recursivos Capítulo 3 Algoritmos recursivos Los algoritmos recursivos se basan en la metodología de llamar repetidamente la propia función en que están definidos, y son de gran utilidad en multitud de campos en la

Más detalles

<tipo> Tipo de dato de los elementos del vector

<tipo> Tipo de dato de los elementos del vector Vectores y matrices Declaración Vector (array unidimiensional): []; Tipo de dato de los elementos del vector Identificador de la variable.

Más detalles

Tema 2. Divide y vencerás.

Tema 2. Divide y vencerás. Programa de teoría Parte I. Estructuras de Datos. 1. Abstracciones especificaciones. 2. Conjuntos diccionarios. 3. Representación de conjuntos mediante árboles. 4. Grafos. Parte II. Algorítmica. 1. Análisis

Más detalles

Fundamentos PHP. El término puntuación nos referimos a la sintaxis usada en PHP para la terminación de una línea de código (;)

Fundamentos PHP. El término puntuación nos referimos a la sintaxis usada en PHP para la terminación de una línea de código (;) Tags Fundamentos PHP La Sintaxis de PHP se deriva de muchos lenguajes de programación principalmente de C pero Perl también ha tenido mucha influencia en esta sintaxis Con las últimas incorporaciones agregadas,

Más detalles

RECURSIVIDAD. Prof. Ing. M.Sc. Fulbia Torres

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

Más detalles

Recursión. Capítulo 4

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

Más detalles

Hoja de ejercicios del Tema 9

Hoja de ejercicios del Tema 9 Facultad de Informática Universidad Complutense Fundamentos de la programación Curso 2013 2014 Hoja de ejercicios del Tema 9 1. Sin ejecutarlo, qué mostraría el siguiente código? int x = 5, y = 12, z;

Más detalles

ALGORÍTMICA. Dpto. Ingeniería de Sistemas y Automática Facultad de Ciencias Universidad de Valladolid.

ALGORÍTMICA. Dpto. Ingeniería de Sistemas y Automática Facultad de Ciencias Universidad de Valladolid. ALGORÍTMICA Dpto. Ingeniería de Sistemas y Automática Facultad de Ciencias Universidad de Valladolid. Indíce Algoritmo Elementos de un algoritmo: Variables, Constantes, Expresiones Datos: Definición y

Más detalles

Estructura de Datos. Complejidad de Algoritmos. Algoritmo. Algoritmo. Mauricio Solar Lorna Figueroa

Estructura de Datos. Complejidad de Algoritmos. Algoritmo. Algoritmo. Mauricio Solar Lorna Figueroa Estructura de Datos Complejidad de Algoritmos Mauricio Solar Lorna Figueroa 2010 1 Algoritmo Definición: Un algoritmo es un conjunto finito de instrucciones que sirven para resolver un problema si fueron

Más detalles

Apuntes de Teórico PROGRAMACIÓN 3

Apuntes de Teórico PROGRAMACIÓN 3 Apuntes de Teórico PROGRAACIÓN Programación Dinámica Versión. Índice Índice... Introducción... Principio de optimalidad...5 Ejemplo: Camino de menor costo...6 Ejemplo: problema de la mochila...6 Aplicación

Más detalles

Análisis de algoritmos

Análisis de algoritmos Tema 08: Divide y vencerás (DyV) M. en C. Edgardo Adrián Franco Martínez http://www.eafranco.com edfrancom@ipn.mx @edfrancom edgardoadrianfrancom 1 Contenido Introducción Divide y vencerás Observaciones

Más detalles

Unidad II: Análisis semántico

Unidad II: Análisis semántico Unidad II: Análisis semántico Se compone de un conjunto de rutinas independientes, llamadas por los analizadores morfológico y sintáctico. El análisis semántico utiliza como entrada el árbol sintáctico

Más detalles

Objetivos de la práctica: - Trabajar las estructuras de control repetitivas en la realización de programas.

Objetivos de la práctica: - Trabajar las estructuras de control repetitivas en la realización de programas. Objetivos de la práctica: - Trabajar las estructuras de control repetitivas en la realización de programas. Sentencias de Control repetitivas (o bucles) Al igual que las estructuras selectivas, el bucle

Más detalles

Complejidad computacional. Algoritmos y Estructuras de Datos I. Complejidad computacional. Notación O grande

Complejidad computacional. Algoritmos y Estructuras de Datos I. Complejidad computacional. Notación O grande Complejidad computacional Algoritmos y Estructuras de Datos I Segundo cuatrimestre de 2014 Departamento de Computación - FCEyN - UBA Algoritmos - clase 10 Introducción a la complejidad computacional y

Más detalles

Divide & Conquer. Herman Schinca. Clase de Junio de 2011

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.

Más detalles

UAA Sistemas Electrónicos Estructura de Datos Muñoz / Serna

UAA Sistemas Electrónicos Estructura de Datos Muñoz / Serna 2 Recursividad 2.1 Concepto de recursividad Se dice que una función es recursiva cuando dicha función se define en términos de la misma función. Es importante recordar que no todas la funciones pueden

Más detalles

Funciones: Pasos por Referencia Recursividad

Funciones: Pasos por Referencia Recursividad Funciones: Pasos por Referencia Recursividad Fundamentos de Programación Fundamentos de Programación I Parámetros por referencia Con la instrucción return sólo se puede devolver un valor calculado. A veces

Más detalles

Algoritmos Recursivos de Búsqueda y Ordenación y sus tiempos

Algoritmos Recursivos de Búsqueda y Ordenación y sus tiempos Estructura de Datos y Algoritmos Algoritmos Recursivos de Búsqueda y Ordenación y sus tiempos 1. Algoritmos de ordenación recursivos 1.1. Mergesort, Ordenamiento por fusión Mergesort se ejecuta en un tiempo

Más detalles

Algorítmica y Complejidad. Tema 3 Ordenación.

Algorítmica y Complejidad. Tema 3 Ordenación. Algorítmica y Complejidad Tema . Introducción.. Algoritmo de inserción.. Algoritmo de selección.. Algoritmo de la burbuja.. Algoritmo heapsort.. Algoritmo quicksort. 7. Algoritmo countingsort.. Algoritmo

Más detalles

Tema 2. Recursividad. Fundamentos de Programación II. Luís Rodríguez Baena (luis.rodriguez@upsam.net)

Tema 2. Recursividad. Fundamentos de Programación II. Luís Rodríguez Baena (luis.rodriguez@upsam.net) Fundamentos de Programación II Tema 2. Recursividad Luís Rodríguez Baena (luis.rodriguez@upsam.net) Universidad Pontificia de Salamanca (campus Madrid) Escuela Superior de Ingeniería y Arquitectura Naturaleza

Más detalles

La recursividad forma parte del repertorio para resolver problemas en Computación y es de los métodos más poderosos y usados.

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

Más detalles

Funciones recursivas

Funciones recursivas Introducción a la Computación Funciones recursivas Esteban E. Mocskos (emocskos@dc.uba.ar) Facultad de Ciencias Exactas y Naturales, UBA CONICET 13/09/2017 E. Mocskos (UBA CONICET) Funciones Recursivas

Más detalles

Recursividad. Definición. Diseño de Algoritmos Recursivos

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

Más detalles

Cursosindustriales. Curso de C / C++ Por Deimos_hack

Cursosindustriales. Curso de C / C++ Por Deimos_hack MÓDULO 1. ESTRUCTURAS Y FUNCIONES. En los capítulos anteriores has visto como los arrays permiten almacenar diferentes datos, pero todos del mismo tipo de dato. En la práctica esto no compensa debido a

Más detalles

Programación (PRG) PRÁCTICA 10. Algoritmos de búsqueda

Programación (PRG) PRÁCTICA 10. Algoritmos de búsqueda Programación (PRG) Facultad de Informática Departamento de Sistemas Informáticos y Computación Universidad Politécnica de Valencia 1. Introducción El objetivo de esta práctica es estudiar el comportamiento

Más detalles

Complejidad computacional (Análisis de Algoritmos)

Complejidad computacional (Análisis de Algoritmos) Definición. Complejidad computacional (Análisis de Algoritmos) Es la rama de las ciencias de la computación que estudia, de manera teórica, la optimización de los recursos requeridos durante la ejecución

Más detalles

Una Introducción a la Programación Estructurada en C

Una Introducción a la Programación Estructurada en C Una Introducción a la Programación Estructurada en C Otoño 2013 Índice I 1 Estructura de un programa en C 2 El primer programa en C Lectura de datos Consideraciones adicionales 3 Estructura de control

Más detalles

TEMA 9: Tecnología de la programación. Tipos abstractos de datos. Algoritmos de búsqueda y ordenación, recursividad, complejidad.

TEMA 9: Tecnología de la programación. Tipos abstractos de datos. Algoritmos de búsqueda y ordenación, recursividad, complejidad. TEMA 9: Tecnología de la programación. Tipos abstractos de datos. Algoritmos de búsqueda y ordenación, recursividad, complejidad. Índice Introducción...1 Materias tratadas por la tecnología de la programación...2

Más detalles

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 Recursividad Franco Guidi Polanco Escuela de Ingeniería Industrial Pontificia Universidad Católica de Valparaíso, Chile fguidi@ucv.cl Recursividad v Es la técnica de definir un proceso en términos de si

Más detalles

Especificación de programas. Algoritmos y Estructuras de Datos I. Correctitud de ciclos

Especificación de programas. Algoritmos y Estructuras de Datos I. Correctitud de ciclos Especificación de programas Algoritmos y Estructuras de Datos I Segundo cuatrimestre de 2014 Departamento de Computación - FCEyN - UBA Simulacro Coloquio Final - clase 1 Sean dos programas, cada uno recibe

Más detalles

la solución a una ecuación cuadrática solicitando al usuario los términos de dicha ecuación.

la solución a una ecuación cuadrática solicitando al usuario los términos de dicha ecuación. ALGORITMOS SECUENCIALES: La estructura secuencial es aquella en la que una acción (instrucción) sigue a otra en secuencia. Las tareas se suceden de tal modo que la salida de una es la entrada de la siguiente

Más detalles

Profesor: José Miguel Rubio L.

Profesor: José Miguel Rubio L. Profesor: José Miguel Rubio L. Magíster en Ingeniería Informática Ingeniero Civil en Informática Licenciado en Ciencias de la Ingeniería Técnico en Programación Oficina: 3-20 e-mail 1: jose.rubio.l@ucv.cl

Más detalles

Introducción. Algoritmos y Complejidad. Algoritmos y Algoritmia. Introducción. Problemas e instancias. Pablo R. Fillottrani

Introducción. Algoritmos y Complejidad. Algoritmos y Algoritmia. Introducción. Problemas e instancias. Pablo R. Fillottrani Introducción Introducción Pablo R. Fillottrani Depto. Ciencias e Ingeniería de la Computación Universidad Nacional del Sur Algoritmos y Algoritmia Problemas e instancias Primer Cuatrimestre 2014 Algoritmos

Más detalles

RECURRENCIA RECURSIÓN o RECURSIVIDAD

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

Más detalles

Control de Flujo. Estructuras de Control! Experiencia Educativa de Algorítmica CONTROL DE FLUJO

Control de Flujo. Estructuras de Control! Experiencia Educativa de Algorítmica CONTROL DE FLUJO Control de Flujo Estructuras de Control Experiencia Educativa de Algorítmica 1 Introducción El estilo de como escribimos y analizamos un algoritmo se convierte en una de las principales características

Más detalles

Esquema de Dividir y Vencer

Esquema de Dividir y Vencer Esquema de Dividir y Vencer Amalia Duch Barcelona, marzo de 2006 Índice 1. Esquema general 1 2. Búsqueda binaria (binary search) 2 3. Ordenación por fusión (merge sort) 2 4. Ordenación rápida (quick sort)

Más detalles

INSTITUTO NACIONAL SUPERIOR DEL PROFESORADO TÉCNICO - TÉCNICO SUPERIOR EN INFORMÁTICA APLICADA - PROGRAMACIÓN I

INSTITUTO NACIONAL SUPERIOR DEL PROFESORADO TÉCNICO - TÉCNICO SUPERIOR EN INFORMÁTICA APLICADA - PROGRAMACIÓN I RESOLUCIÓN DE PROBLEMAS Y ALGORITMOS La principal razón para que las personas aprendan lenguajes de programación es utilizar una computadora como una herramienta para la resolución de problemas. Cinco

Más detalles

Programación. Tema 8: Tablas Hash. Apuntes elaborados por: Eduardo Quevedo, Aaron Asencio y Raquel López Revisado por: Javier Miranda el????

Programación. Tema 8: Tablas Hash. Apuntes elaborados por: Eduardo Quevedo, Aaron Asencio y Raquel López Revisado por: Javier Miranda el???? Programación. Tema : Tablas Hash /Mayo/ Apuntes elaborados por: Eduardo Quevedo, Aaron Asencio y Raquel López Revisado por: Javier Miranda el???? Tema : Tabla Hash Las tabla hash aparece para conseguir

Más detalles

TEMA 7. ALGORITMOS DE BÚSQUEDA, ORDENACIÓN

TEMA 7. ALGORITMOS DE BÚSQUEDA, ORDENACIÓN M.P. Sesmero, P. de Toledo, F.J. Ordoñez, J. Gómez-Romero, J.A. Iglesias, J.L. Mira Programación TEMA 7. ALGORITMOS DE BÚSQUEDA, ORDENACIÓN Y MEZCLA Grado en Ingeniería en Tecnologías Industriales Programación

Más detalles

IN34A - Optimización

IN34A - Optimización IN34A - Optimización Complejidad Leonardo López H. lelopez@ing.uchile.cl Primavera 2008 1 / 33 Contenidos Problemas y Procedimientos de solución Problemas de optimización v/s problemas de decisión Métodos,

Más detalles

Tema 1 INTRODUCCIÓN A LOS LENGUAJES DE PROGRAMACIÓN

Tema 1 INTRODUCCIÓN A LOS LENGUAJES DE PROGRAMACIÓN Tema 1 INTRODUCCIÓN A LOS LENGUAJES DE PROGRAMACIÓN - Introducción - Sintaxis - Semántica básica - Tipos de datos - Expresiones y enunciados - Procedimientos y ambientes - Tipos abstractos de datos y módulos

Más detalles

Solución - práctico 10

Solución - práctico 10 Solución - práctico 10 Complejidad Ejercicio 1 a) Una implementación del algoritmo es la siguiente: /* Procedimiento que se encarga de realizar la unión de los dos conjuntos * ordenados der1 e izq1 son

Más detalles

INDICE Prologo Capitulo 1. Algoritmos y programas Capitulo 2. La resolución de los problemas con computadoras y las herramientas de programación

INDICE Prologo Capitulo 1. Algoritmos y programas Capitulo 2. La resolución de los problemas con computadoras y las herramientas de programación INDICE Prologo XI Capitulo 1. Algoritmos y programas 1.1. Configuraciones de una computadora 1 1.2. Lenguajes de programación 2 1.3. Resolución de problemas 1.3.1. Fase de resolución del problema 3 1.3.1.1.

Más detalles

Arreglos. Algoritmos y Estructuras de Datos I. Arreglos en C++ Arreglos y listas

Arreglos. Algoritmos y Estructuras de Datos I. Arreglos en C++ Arreglos y listas Arreglos Algoritmos y Estructuras de Datos I Primer cuatrimestre 2007 Teórica de imperativo 3 Algoritmos de búsqueda secuencias de una cantidad fija de variables del mismo tipo se declaran con un nombre,,

Más detalles

Capítulo 13 INSTRUCCIONES DE CONTROL REPETITIVAS. Presentación resumen del libro: "EMPEZAR DE CERO A PROGRAMAR EN lenguaje C"

Capítulo 13 INSTRUCCIONES DE CONTROL REPETITIVAS. Presentación resumen del libro: EMPEZAR DE CERO A PROGRAMAR EN lenguaje C Presentación resumen del libro: "EMPEZAR DE CERO A PROGRAMAR EN lenguaje C" Autor: Carlos Javier Pes Rivas (correo@carlospes.com) Capítulo 13 INSTRUCCIONES DE CONTROL REPETITIVAS 1 OBJETIVOS Conocer las

Más detalles

CAPÍTULO 3 ESTRUCTURAS DE DATOS ESTÁTICAS

CAPÍTULO 3 ESTRUCTURAS DE DATOS ESTÁTICAS CAPÍTULO 3 ESTRUCTURAS DE DATOS ESTÁTICAS Capítulo 3 Estructuras de datos estáticas 1/37 1. INTRODUCCIÓN Las estructuras de datos se utilizan, generalmente, para procesar una colección de valores que están

Más detalles

Métodos de Ordenamiento. Unidad VI: Estructura de datos

Métodos de Ordenamiento. Unidad VI: Estructura de datos Métodos de Ordenamiento Unidad VI: Estructura de datos Concepto de ordenación La ordenación de los datos consiste en disponer o clasificar un conjunto de datos (o una estructura) en algún determinado orden

Más detalles

Dobles: Es el caso de la instrucción if-else (punto 1.2).

Dobles: Es el caso de la instrucción if-else (punto 1.2). 1 1.Introducción Las estructuras de control son instrucciones que nos permiten controlar el flujo de ejecución del programa. Las instrucciones de control se pueden agrupar en instrucciones condicionales

Más detalles

Estructuras de datos Listas y árboles

Estructuras de datos Listas y árboles Estructuras de datos Listas y árboles Dra. Elisa Schaeffer elisa.schaeffer@gmail.com PISIS / FIME / UANL Listas y árboles p. 1 Listas Listas son estructuras un poco más avanzadas que puros arreglos, como

Más detalles

Si un número es múltiplo de otro, u dicho de forma, comprobar si un número es divisor de otro.

Si un número es múltiplo de otro, u dicho de forma, comprobar si un número es divisor de otro. 1.Introducción La programación es una herramienta muy poderosa para resolver todo tipo de problemas, entre ellos los problemas matemáticos. En este artículo se muestra cómo se resuelven algoritmos básicos,

Más detalles

PHP: Lenguaje de programación

PHP: Lenguaje de programación Francisco J. Martín Mateos Carmen Graciani Diaz Dpto. Ciencias de la Computación e Inteligencia Artificial Universidad de Sevilla Tipos de datos Enteros Con base decimal: 45, -43 Con base octal: 043, -054

Más detalles

Ciclos. Recordando Estructuras de Control Básicas: SELECCIÓN (condición) SECUENCIAL

Ciclos. Recordando Estructuras de Control Básicas: SELECCIÓN (condición) SECUENCIAL Ciclos Fundamentos de Programación Recordando Estructuras de Control Básicas: Una secuencia es una serie de estatutos que se ejecutan uno después de otro. Selección (condición) ejecuta diferentes estatutos

Más detalles

ANEXO XVII DE LA RESOLUCION N

ANEXO XVII DE LA RESOLUCION N Hoja 1 de 7 UNIVERSIDAD NACIONAL DE CÓRDOBA Facultad de Ciencias Exactas Físicas y Naturales República Argentina Programa de: Código: Informática Carrera: Materia común Res. Nº Plan: Puntos:3.5 Escuela:

Más detalles

Programación imperativa. Algoritmos y Estructuras de Datos I. Ciclos

Programación imperativa. Algoritmos y Estructuras de Datos I. Ciclos Programación imperativa Algoritmos y Estructuras de Datos I Segundo cuatrimestre de 2014 Departamento de Computación - FCEyN - UBA Programación imperativa - clase 6 Ciclos y arreglos Entidad fundamental:

Más detalles

Uniciencia E-ISSN: Universidad Nacional Costa Rica

Uniciencia E-ISSN: Universidad Nacional Costa Rica Uniciencia E-ISSN: 2215-3470 revistauniciencia@una.cr Universidad Nacional Costa Rica de Dios Murillo Morera, Juan; Caamaño Polini, Santiago COMPARACIÓN ENTRE ALGORITMOS RECURSIVOS E ITERATIVOS Y SU MEDICIÓN

Más detalles

Recursividad... un análisis posterior. Aurelio Sanabria Introducción a la programación

Recursividad... un análisis posterior. Aurelio Sanabria Introducción a la programación Recursividad... un análisis posterior Aurelio Sanabria Introducción a la programación II semestre, 2016 Construyendo Programas Buscar soluciones a problemas (pensar en un algoritmo) requiere de una etapa

Más detalles

Parte de Algoritmos de la asignatura de Programación Master de Bioinformática. Búsqueda exhaustiva

Parte de Algoritmos de la asignatura de Programación Master de Bioinformática. Búsqueda exhaustiva Parte de Algoritmos de la asignatura de Programación Master de Bioinformática Búsqueda exhaustiva Web asignatura: http://dis.um.es/~domingo/algbio.html E-mail profesor: domingo@um.es Transparencias preparadas

Más detalles

Introducción Supongamos un subconjunto de n elementos X = {e 1,,e n de un conjunto referencial Y, X Y. Dentro de Y se define una relación de orden tot

Introducción Supongamos un subconjunto de n elementos X = {e 1,,e n de un conjunto referencial Y, X Y. Dentro de Y se define una relación de orden tot Algoritmos de ordenación Análisis y Diseño de Algoritmos Algoritmos de ordenación Algoritmos básicos: Θ(n 2 ) Ordenación por inserción Ordenación por selección Ordenación por intercambio directo (burbuja)

Más detalles

Métodos de ordenamiento y búsqueda para datos en memoria principal

Métodos de ordenamiento y búsqueda para datos en memoria principal Ordenamiento Métodos de ordenamiento y búsqueda para datos en memoria principal Dada una colección que contiene un número elementos, el ordenamiento es el proceso de reacomodar un conjunto de elementos

Más detalles

Recursividad. Figura 1. Cálculo del factorial de un número determinado.

Recursividad. Figura 1. Cálculo del factorial de un número determinado. Recursividad La recursividad es una metodología de programación que en la práctica suele ser muy compleja, es por ello que este tema es tratado en cursos universitarios de programación avanzada. Por lo

Más detalles

fundamentos de programación (unidad 4) programación estructurada en Java

fundamentos de programación (unidad 4) programación estructurada en Java fundamentos de programación (unidad 4) programación estructurada en Java Para ver una copia completa de la licencia, acudir a la dirección http://creativecommons.org/licenses/by-nc-sa/2.5/es/legalcode.es

Más detalles

Estructura de Datos. Árboles Binarios de Búsqueda ABB. Primer Semestre, 2010

Estructura de Datos. Árboles Binarios de Búsqueda ABB. Primer Semestre, 2010 Estructura de Datos Árboles Binarios de Búsqueda ABB Prof.: Mauricio Solar Prof.: Lorna Figueroa Primer Semestre, 20 1 Arboles de Búsqueda Binaria El árbol binario de búsqueda (ABB) toma su nombre del

Más detalles

Tema: Funciones, Procedimientos y Recursividad en C#.

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

Más detalles

Taller de Videojuegos. Pedro J. Camacho

Taller de Videojuegos. Pedro J. Camacho Taller de Videojuegos Pedro J. Camacho CONTENIDOS Animando la escena Diseña tu guión (storyboard) Instrucciones Sentencias de control Condicionales Bucles Propiedades (Atributos) Funciones (Métodos) Eventos

Más detalles

18 Análisis sintáctico III Compiladores - Profr. Edgardo Adrián Franco Martínez. Clasificación de métodos de análisis sintáctico Análisis descendente

18 Análisis sintáctico III Compiladores - Profr. Edgardo Adrián Franco Martínez. Clasificación de métodos de análisis sintáctico Análisis descendente 2 Contenido Clasificación de métodos de análisis sintáctico Análisis descendente Análisis descendente recursivo Análisis descendente predictivo Métodos deterministas Problemas del análisis descendente

Más detalles

UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO CENTRO UNIVERSITARIO UAEM ATLACOMULCO INGENIERÍA EN COMPUTACIÓN

UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO CENTRO UNIVERSITARIO UAEM ATLACOMULCO INGENIERÍA EN COMPUTACIÓN UNIVERSIDAD AUTÓNOMA DEL ESTADO DE MÉXICO CENTRO UNIVERSITARIO UAEM ATLACOMULCO INGENIERÍA EN COMPUTACIÓN REPORTE DE INVESTIGACIÓN PROGRAMA FUNCIÓN FACTORIAL ALGORITMO PROGRAMA FUNCION FIBONACCI ALGORITMO

Más detalles