4 Recursividad. Contenido. 4. Recursividad Definición y Tipos de recursividad
|
|
- Encarnación Ortiz Velázquez
- hace 7 años
- Vistas:
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 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 detallesComplejidad 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 detallesRecursividad. 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 detallesRecursividad 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 detallesAná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 detallesProgramació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 detallesProgramació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 detallesUniversidad 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 detallesTema 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 detallesTema 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 detallesTema 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 detallesLuis 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 detallesTema: 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 detallesUNIVERSIDAD 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 detallesDepartamento 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 detallesEstructura 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 detallesTema 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 detallesTema: 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 detallesAlgoritmos 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 detallesESTRUCTURA 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 detallesTema 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 detallesDiseñ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 detallesAlgoritmos 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 detallesTema 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 detallesUNIDAD 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 detallesEstructuras 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 detallesEjercicios 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 detallesTEMA 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 detallesUniversidad 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 detallesAlgoritmos 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 detallesAgradecimientos. 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 detallesEstructura 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 detallesTema 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 detallesCapí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
Vectores y matrices Declaración Vector (array unidimiensional): []; Tipo de dato de los elementos del vector Identificador de la variable.
Más detallesTema 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 detallesFundamentos 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 detallesRECURSIVIDAD. 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 detallesRecursió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 detallesHoja 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 detallesALGORÍ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 detallesEstructura 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 detallesApuntes 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 detallesAná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 detallesUnidad 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 detallesObjetivos 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 detallesComplejidad 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 detallesDivide & 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 detallesUAA 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 detallesFunciones: 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 detallesAlgoritmos 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 detallesAlgorí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 detallesTema 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 detallesLa 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 detallesFunciones 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 detallesRecursividad. 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 detallesCursosindustriales. 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 detallesProgramació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 detallesComplejidad 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 detallesUna 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 detallesTEMA 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 detallesRecursividad. 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 detallesEspecificació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 detallesla 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 detallesProfesor: 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 detallesIntroducció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 detallesRECURRENCIA 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 detallesControl 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 detallesEsquema 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 detallesINSTITUTO 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 detallesProgramació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 detallesTEMA 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 detallesIN34A - 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 detallesTema 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 detallesSolució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 detallesINDICE 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 detallesArreglos. 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 detallesCapí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 detallesCAPÍ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 detallesMé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 detallesDobles: 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 detallesEstructuras 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 detallesSi 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 detallesPHP: 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 detallesCiclos. 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 detallesANEXO 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 detallesProgramació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 detallesUniciencia 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 detallesRecursividad... 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 detallesParte 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 detallesIntroducció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 detallesMé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 detallesRecursividad. 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 detallesfundamentos 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 detallesEstructura 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 detallesTema: 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 detallesTaller 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 detalles18 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 detallesUNIVERSIDAD 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