Por ejemplo, el factorial puede definirse de manera recursiva de la siguiente manera:

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

Download "Por ejemplo, el factorial puede definirse de manera recursiva de la siguiente manera:"

Transcripción

1 RECURSIVIDAD Existen muchas funciones matemáticas cuyos argumentos son números naturales, que pueden definirse de manera recursiva. Esto quiere decir que el valor de la función para el argumento n puede definirse en términos del argumento n-1 (o alguno anterior). En este tipo de definiciones siempre existirá un caso base a partir del cual parte la definición, el cual normalmente es el valor de la función en cero o en uno, aunque no necesariamente debe ser así. Por ejemplo, el factorial puede definirse de manera recursiva de la siguiente manera: Para definir una función en forma recursiva es necesario especificar: Caso(s) base: Donde la recursividad se detiene Paso de recursión: Como se define un elemento distinto del base, en términos de elementos anteriores. Usualmente los lenguajes de programación permiten definir funciones de manera recursiva. El lenguaje C es uno de ellos. La definición recursiva para el factorial sería: int factorial(int n) { if ((n == 0) (n == 1)) return(1); else return(n*factorial(n-1)); Normalmente las definiciones recursivas pueden expresarse en forma no recursiva. Sin embargo, dependiendo del caso, el resultado puede ser más confuso. Por ejemplo, una función en C que calcula el factorial en forma iterativa sería: int factorial(int n) { int i, fact = 1; for (i=2; i<=n; i++) fact = fact * i; return(fact); Sin embargo, los algoritmos iterativos tienen una ventaja en cuanto al uso de memoria, si se comparan con los recursivos. La recursividad requiere que se guarde el estado de la ejecución antes de cada llamado recursivo, implicando un gasto considerable de memoria. Es probable que, por esta razón, las versiones recursivas tengan mayores limitaciones al

2 ejecutarse en un computador. La aplicación de las definiciones recursivas puede ampliarse a una amplia gama de problemas, en los que la solución más natural puede ser la que se expresa de esta forma. Por ejemplo, para buscar un número en un vector podemos tener una función que reciba como argumento el vector, el rango de búsqueda y el número buscado. El prototipo de esta función sería como: int busqueda(int vec[], int inicio, int fin, int num); La función que quiere hacer la búsqueda haría el llamado indicando los rangos apropiados para el vector: resultado = busqueda(vector, 0, N, x); La función busqueda() puede hacer su trabajo partiendo el vector en dos partes y llamándose a sí misma en forma recursiva, de la siguiente manera: res1 = busqueda(vec, inicio, fin-inicio/2, num); res2 = busqueda(vec, (fin-inicio/2)+1, fin, num); El caso base sería cuando el vector que recibe la función busqueda() contiene un único elemento. En este caso simplemente compara el elemento con el número buscado y retorna el valor apropiado. Más adelante, en el capítulo sobre Ordenamiento y Búsqueda, se tratará en detalle este algoritmo que recibe el nombre de Búsqueda Binaria. Ejemplo: Números de Fibonacci La Sucesión de Fibonacci es una secuencia de números naturales, que empieza con 0 y 1, y cuyos siguientes términos están definidos como la suma de los dos anteriores:

3 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144,... Algoritmo Recursivo Es bastante sencillo y natural definir la Sucesión de Fibonacci en forma recursiva: A partir de esta definición, se puede escribir una función en C que genere el término n- ésimo de la sucesión. En el siguiente ejemplo se presenta esta función, junto con un programa de prueba que pide un número entero al usuario y determina el correspondiente término de la sucesión. /*************************************************************************** * Ejemplo: Calculo recursivo del n-esimo termino de fibonacci * Por definicion: * Fibonacci(0) = 0 * Fibonacci(1) = 1 * Fibonacci(n) = Fibonacci(n - 1) + Fibonacci(n - 2) ***************************************************************************/ double Fibonacci(int n) { switch (n) { case 0 : return 0; case 1 : return 1; default: return Fibonacci(n - 1) + Fibonacci(n - 2); /* ^-- Llamado recursivo --^ */ /*************************************************************************** * Programa que calcula, de forma recursiva, el termino n-esimo de la * sucesion de fibonacci, para un valor n dado por el usuario. ***************************************************************************/ main() { int n; printf("ingrese el valor de n: "); /* Se solicita al usuario el valor de n */ scanf("%d", &n); /* scanf requiere puntero: & */ /* Imprime el fibonacci de n */ printf("el termino %d de Fibonacci es: %.0lf\n", n, Fibonacci(n)); Ejemplo de ejecución: Ingrese el valor de n: 10 El termino 10 de Fibonacci es: 55 Ingrese el valor de n: 20 El termino 20 de Fibonacci es: 6765 Algoritmo Iterativo En contraposición a la implementación recursiva que se presentó anteriormente, se ofrece aquí una versión iterativa de la función para calcular el n-ésimo término de la Sucesión de Fibonacci.

4 Para implementar el algoritmo en forma iterativa, es necesario guardar en variables los valores para los dos términos anteriores de la sucesión, para poder llevar a cabo el cálculo del siguiente. Una vez hecho esto se actualizan los valores anteriores para preparar el siguiente cálculo (siguiente iteración). Compare ambas funciones. Aparentemente la versión recursiva es más limpia y clara (fácil de entender) que su contraparte iterativa. Cuál es su opinión?. Se mantiene el mismo programa de prueba empleado anteriormente. /************************************************************************** * Ejemplo: Calculo iterativo del n-esimo termino de fibonacci * Por definicion: * Fibonacci(0) = 0 * Fibonacci(1) = 1 * Fibonacci(n) = Fibonacci(n - 1) + Fibonacci(n - 2) ***************************************************************************/ /************************************************************************** * Funcion que calcula iterativamente el n-esimo termino de fibonacci **************************************************************************/ double Fibonacci(int n) { int i; double Fibi, Fibn1, Fibn2; switch (n) { case 0 : return 0; case 1 : return 1; default : Fibn2 = 0; /* Fibonacci(n - 2) */ Fibn1 = 1; /* Fibonacci(n - 1) */ for (i = 2; i <= n; i++) { Fibi = Fibn1 + Fibn2; Fibn2 = Fibn1; Fibn1 = Fibi; return Fibi; /*************************************************************************** * Programa que calcula, de forma iterativa, el termino n-esimo de la * sucesion de fibonacci, para un valor n dado por el usuario. ***************************************************************************/ main() { int n; printf("ingrese el valor de n: "); /* Se solicita al usuario el valor de n */ scanf("%d", &n); /* scanf requiere puntero: & */ /* Imprime el fibonacci de n */ printf("el termino %d de Fibonacci es: %.0lf\n", n, Fibonacci(n)); Ejemplo de ejecución: Ingrese el valor de n: 10 El termino 10 de Fibonacci es: 55 Ingrese el valor de n: 20 El termino 20 de Fibonacci es: 6765 Experimento Sugerido Como se mencionó al introducir la recursividad, la implementación recursiva de un algoritmo normalmente consume más memoria que su contraparte iterativa. Esto se debe a que es necesario guardar el estado actual de la ejecución antes de cada llamado recursivo.

5 Esto puede provocar limitaciones importantes en los programas que emplean funciones recursivas. Se sugiere probar los dos programas ofrecidos en esta sección para valores altos (a partir de 20) y comparar los resultados obtenidos. Variantes Propuestas A manera de ejercicio pueden escribirse variantes de este programa, que empleen la función Fibonacci, ya sea iterativa o recursiva: Programa que lee un número y dice si pertenece a la Sucesión de Fibonacci. Programa lee un número entero n y despliega en pantalla los primeros n términos de la Sucesión de Fibonacci. En este caso, existe alguna ventaja en usar una versión sobre la otra?, por qué?.

6 Ejemplo: Obtención del máximo en un vector de enteros En este ejemplo mostraremos una función recursiva para encontrar el valor máximo en un vector de números enteros. Se incluye un programa de prueba que recibe los valores del vector del usuario y despliega el valor máximo calculado mediante la función mencionada. Algoritmo La definición recursiva de la función para obtener el máximo puede hacerse como: Si el vector tiene un único elemento, ese elemento es el máximo (caso base). Si el valor en la posición inicial del vector es mayor que el maximo del resto del vector, entonces el valor de la primera posición es el máximo global. Si el valor en la posición inicial del vector es menor que el maximo del resto del vector, entonces el máximo global será el máximo en el resto del vector. Escrito en palabras simples: Para encontrar el máximo en un vector, basta comparar el primer elemento con el máximo del resto del vector. /*************************************************************************** * Funcion recursiva que obtiene el maximo en un vector de numeros enteros. * Retorna el valor del maximo elemento dentro del vector. ***************************************************************************/ #define TAMANO_VECTOR 100 /* Definicion del tamano maximo del vector */ int Maximo(int vector[], int n) { int max, maxresto; if (n == 1) max = vector[0]; /* Caso base */ else { maxresto = Maximo(vector+1, n-1); /* Maximo del resto del vector */ if (vector[0] > maxresto) max = vector[0]; else max = maxresto; return(max); main() { int i; int n=0; int vec[tamano_vector]; while (n < 1) { /* Garantiza que el usuario ingresa un numero de eltos > 0 */ printf("ingrese el numero de elementos: "); scanf("%d", &n); for (i=0; i<n; i++) { /* Lee los elementos del vector */ printf("\telemento[%d]: ", i); scanf("%d", &vec[i]); /* Calcula el maximo a la vez que despliega el resultado */ printf("\nmaximo: %d\n", Maximo(vec, n)); Ejemplo de ejecución: Ingrese el numero de elementos: 5 Elemento[0]: 6 Elemento[1]: 10 Elemento[2]: 8 Elemento[3]: 15 Elemento[4]: 12 Maximo: 15

7 Ejemplo: Función para calcular módulo El operador binario módulo obtiene el resto o residuo de la división de dos números enteros. Es bastante sencillo definir en forma recursiva la operación m mód n. La idea es ir restando el divisor del dividendo y calculando de nuevo el módulo, pues el resultado es el mismo. La recursividad se detiene cuando el divisor es mayor que el dividendo. En ese caso el resultado es el dividendo. La definición sería: A partir de esta definición, se puede escribir una función en C que calcule m mód n, con m y n como los parámetros de la función. En el siguiente ejemplo se presenta esta función, junto con un programa de prueba que pide dos números enteros al usuario, calcula la operación y muestra en pantalla el resultado. /*********************************************************************** * Ejemplo: Calculo recursivo de m mod n * Por definicion: * m mod n = m, si m < n * m mod n = ( m - n ) mod n, si m >= n ***********************************************************************/ int modulo(int m, int n) { if (m < n) return(m); else return( modulo( (m-n), n) ); /* ^-- Llamado recursivo */ main() { int m, n; printf("ingrese el valor de m: "); /* Se solicita los valores de m y n */ scanf("%d", &m); /* scanf requiere puntero: & */ printf("ingrese el valor de n: "); scanf("%d", &n); /* scanf requiere puntero: & */ /* Imprime el resultado de m mod n, empleando la funcion modulo */ printf("%d mod %d es: %d\n", m, n, modulo(m,n)); Ejemplo de ejecución: Ingrese el valor de m: 10 Ingrese el valor de n: 3 10 mod 3 es: 1 Ingrese el valor de m: 3 Ingrese el valor de n: 5 3 mod 5 es: 3 Ingrese el valor de m: 3 Ingrese el valor de n: 3 3 mod 3 es: 0

8 Ejercicio Propuesto De manera similar a como se definió recursivamente el operador módulo es posible definir el operador para división entera, es decir, división sobre operandos enteros y cuyo resultado es entero (se ignoran los decimales). Se deja como ejercicio la definición recursiva de este operador y la implementación de la función en C correspondiente. Como programa de prueba puede emplearse el mismo que se empleó para el módulo con unos pocos cambios. Ejemplo: Solución de un laberinto Se presenta un programa que resuelve laberintos en forma recursiva. El laberinto a resolver se representa mediante una matriz de números enteros. Descripción Se presenta un programa que resuelve laberintos en forma recursiva. El laberinto a resolver se representa mediante una matriz de números enteros, y su configuración está dada por la inicialización que se haga a dicha matriz. Por esto, para cambiar el laberinto será necesario cambiar el código del programa. Una vez que se haya introducido el concepto de archivo será posible ampliar este programa para que sea más útil, almacenando distintas configuraciones de laberinto en distintos archivos. Diseño A continuación se aplicará nuestra metodología para la solución de problemas para diseñar el programa mencionado. 1. Definición del problema Conceptualización: El problema se ubica en un contexto en el que se debe buscar una solución a un laberinto con una entrada y una salida, y con movimientos válidos en cuatro direcciones (no diagonales). En el caso de este ejemplo, el contexto está limitado a una aplicación de computador, en la que el laberinto está representado mediante una matriz de números enteros. Objetivo: Partiendo de la entrada del laberinto, señalar una ruta que nos guíe hasta la salida. Por ejemplo, dado el siguiente laberinto:

9 Una solución que nos permitiría alcanzar nuestro objetivo sería la ruta mostrada con asteriscos en la siguiente figura: Descripción general de la solución: El problema se resolverá haciendo uso de la recursividad. La solución se basa en una tarea o función que se llamará recursivamente para intentar solucionar el laberinto a partir de una posición particular. Desde cualquier lugar dentro del laberinto se intentará resolverlo primero intentando hacia izquierda, luego a la derecha, luego arriba y finalmente abajo. Para hacer estos intentos se empleará la función recursiva. El procedimiento parte de la posición de entrada. Se utilizarán marcas que serán dejadas en el camino para no intentar por caminos por los que ya se pasó y, en particular, no volver atrás salvo si se determina que no hay solución por el camino que se sigue hasta ahora. Elementos involucrados: No existen elementos externos involucrados en la búsqueda de la solución. El único elemento activo es el computador en sí llevando a cabo su trabajo. En el problema participan también los siguientes elementos pasivos: la matriz que representa el laberinto la ubicación de la entrada la ubicación de la salida 2. Conceptualización de la solución Variables: Como se mencionó, el laberinto estará representado mediante una matriz de números enteros: lab. Además, la posición de la entrada en el laberinto estará dada por las coordenadas dentro de la matriz, representadas por las variables x0, y0, para la fila y la columna, respectivamente. De manera similar, la posición de la salida del laberinto se guardará en xf, yf Todas estas variables serán globales. Cada posición de la matriz puede estar en uno de tres estados: parte del muro (ladrillo) camino libre no visitado camino libre visitado En el programa en C, la declaración de las variables y constantes globales se hará de la siguiente manera:

10 /* Constantes que definen la dimension del laberinto */ #define FILAS 13 #define COLUMNAS 21 /* Caracteres que se almacenan en las posiciones del laberinto: */ /* ASCII 219 es un cuadro relleno que se usa para las paredes */ /* ' ' es un espacio en blanco, para los caminos libres */ /* '*' es la marca que senala las posiciones visitadas (camino) */ #define L 219 #define E ' ' #define MARCA '*' /* Constantes logicas para valor de retorno de funciones */ #define TRUE 1 #define FALSE 0 /* Matriz global que representa el laberinto. En la inicializacion, */ /* L representa un ladrillo en la pared y E un espacio en blanco */ int lab[filas][columnas] = { { L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, { E, E, E, L, E, L, E, L, E, L, E, E, E, L, E, E, E, E, E, E, L, { L, L, E, L, E, E, E, L, E, E, E, L, E, L, E, L, E, E, L, E, L, { L, E, E, E, E, L, E, L, L, L, E, L, E, L, E, L, L, E, L, E, L, { L, E, L, L, L, L, E, L, E, L, E, L, E, L, L, L, E, E, L, E, L, { L, E, E, E, L, E, E, L, E, L, E, L, E, E, E, E, E, L, L, E, L, { L, E, L, L, L, L, L, L, E, L, E, L, L, E, L, E, E, E, E, E, L, { L, E, E, E, E, E, E, E, E, E, E, E, L, E, L, E, L, L, E, L, L, { L, L, L, L, L, L, L, L, L, L, L, E, L, E, L, E, E, L, E, L, L, { L, E, E, E, E, E, E, E, L, E, E, E, L, L, L, L, L, L, E, L, L, { L, E, L, L, L, L, L, E, E, E, L, L, L, E, L, E, E, E, E, E, L, { L, E, E, L, E, E, E, E, L, E, E, L, E, E, E, E, L, L, L, E, E, { L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L ; La inicialización de la matriz que aquí se muestra corresponde al laberinto presentado en la figura del inicio. Los caminos están formados de espacios libres (E's). Observe el contorno del laberinto, formado por L's, y los puntos de entrada y salida. En la implementación de las distintas subtareas se hace uso de otras variables locales, propias de la función de cada subtarea. Descomposición en Tareas: El problema global puede descomponerse en las siguientes tareas. Como las variables más importantes se manejan en forma global, no es necesario pasarlas como parámetros. Este es el caso de la variable lab, la matriz que representa el laberinto. Cada una de las tareas aquí definidas se implementará como una función en el programa en C. Para una mejor comprensión, se incluye el código en C que corresponde a cada una de estas funciones.

11 valida Parámetros: fila y columna de la posición. Valor de retorno: valor booleano que indica si la posición es válida. Descripción: Esta función analiza una posición dentro del laberinto, especificada por la fila y columna recibidas como parámetro, y deduce si es una posición válida para recorrer. Básicamente debe verificar que no esté fuera de los límites del laberinto, que no se trate de una posición en la que hay pared, y que no se trate de una posición previamente visitada. Algoritmo: 1. Inicialmente resultado vale VERDADERO 2. Si la posición dada está fuera del laberinto 2.1. Cambiar resultado a FALSO 3. Si la posición dada es pared o ya fue visitada Código en C: 3.1. Cambiar resultado a FALSO int valida(int f, int c) { int resultado = TRUE; /* Se supone inicialmente valida */ /* Controla si la posicion esta fuera del laberinto */ if ((f<0) (f=filas) (c<0) (c=columnas)) resultado = FALSE; /* Controla si la posicion ya fue visitada o es muro */ if (lab[f][c] == MARCA lab[f][c] == L) resultado = FALSE; return(resultado); recorrer Parámetros: fila y columna (fil y col) desde donde se empieza el recorrido. Valor de retorno: TRUE o FALSE que indica si se logró resolver el laberinto o no. Descripción: Tarea recursiva que recorre el laberinto a partir de una posicion dada por la fila y columna pasadas como parametro y devuelve un valor booleano que indica si se logró llegar a la salida. El caso base de la recursividad (condición de término) es que las coordenadas correspondan con la salida del laberinto. En caso contrario, se procede a marcar la casilla y a intentar en las distintas direcciones (izquierda, derecha, arriba y abajo), asegurándose primero que en esa dirección haya una casilla valida (no ladrillo, no fuera del laberinto y no visitada). En caso en que ninguna dirección nos lleva a la salida, se desmarca la casilla actual (pues se va a retroceder) y se devuelve falso como valor de retorno. Las marcas sirven también para senalar la ruta que conforma la solución, una vez alcanzada.

12 Algoritmo: 1. Inicialmente listo vale FALSO. 2. Se marca la casilla. 3. Si la posición es el fin del laberinto Retornar VERDADERO. 4. Si no se ha solucionado (listo vale FALSO) y la posición de la izquierda es válida Llamar a recorrer recursivamente con la casilla de la izquierda como parámetro y guardar valor de retorno en listo, para ver si se resolvió el laberinto a partir de ahí. 5. Si no se ha solucionado (listo vale FALSO) y la posición de la derecha es válida Llamar a recorrer recursivamente con la casilla de la derecha como parámetro y guardar valor de retorno en listo, para ver si se resolvió el laberinto a partir de ahí. 6. Si no se ha solucionado (listo vale FALSO) y la posición de arriba es válida Llamar a recorrer recursivamente con la casilla de arriba como parámetro y guardar valor de retorno en listo, para ver si se resolvió el laberinto a partir de ahí. 7. Si no se ha solucionado (listo vale FALSO) y la posición de abajo es válida Llamar a recorrer recursivamente con la casilla de abajo como parámetro y guardar valor de retorno en listo, para ver si se resolvió el laberinto a partir de ahí. 8. Si no se logró resolver el laberinto en ninguna dirección (listo todavía vale FALSO) Quitar marca de la casilla (pues no formará parte del camino). 9. Retornar listo indicando si se pudo resolver o no el laberinto.

13 Código en C: int recorrer(int fil, int col) { int listo = FALSE; /* Indica si se ha encontrado la salida */ /* Se marca la casilla como visitada */ lab[fil][col] = MARCA; /* Se controla la condicion de termino de recursividad: */ /* " Llegamos a la salida? " */ if (fil == xf && col == yf) return(true); if (!listo && valida(fil,col-1)) /* Intento a la izquierda */ listo = recorre(fil,col-1); if (!listo && valida(fil,col+1)) /* Intento a la derecha */ listo = recorre(fil,col+1); if (!listo && valida(fil-1,col)) /* Intento hacia arriba */ listo = recorre(fil-1,col); if (!listo && valida(fil+1,col)) /* Intento hacia abajo */ listo = recorre(fil+1,col); /* Si no se logro resolver el laberinto desde esta posicion, se */ /* desmarca la casilla pues no sera parte de la solucion. En este */ /* caso se retornara falso lo que provocara que se retroceda. */ if (!listo) lab[fil][col] = E; /* Se retorna TRUE/FALSE dependiendo de si se encontro solucion */ return(listo); desplegar Parámetros: no tiene Valor de retorno: no tiene Descripción: Despliega en la pantalla el laberinto Algoritmo: 1. Iterar i por todas las filas 1.1. Iterar j por todas las columnas Código en C: Desplegar posición i,j 1.2. Cambiar de línea pues terminó una fila void desplegar() { int i, j; printf("\n"); for (i=0; i<filas; i++) { for (j=0; j<columnas; j++) { printf("%c", lab[i][j]); printf("\n"); return;

14 3. Especificación del algoritmo El algoritmo principal debe llamar a la tarea que recorre el laberinto, especificando como posición la entrada: ( x0, y0 ). Antes y después de la resolución se despliega el laberinto. La segunda vez incluirá el camino que forma la solución (las posiciones que fueron marcadas y no desmarcadas posteriormente). Algoritmo: 1. Desplegar el laberinto sin resolver 2. Recorrer desde la entrada del laberinto: ( x0, y0 ) 3. Si no se pudo resolver 3.1. Desplegar un mensaje indicando que no hay solución 4. Desplegar el laberinto una vez resuelto (con el camino) Código en C: main() { int ok; /* Para saber si se obtuvo solucion */ desplegar(); /* Despliega el laberinto sin resolver */ /* Resuelve el laberinto desde la entrada: (x0,y0) */ ok = recorrer(x0,y0); if (!ok) /* Si no se pudo resolver se envia un mensaje */ printf("\nlaberinto sin solucion\n"); desplegar(); /* Despliega el laberinto resuelto (con el camino) */ 4. Validación del algoritmo La validación de un algoritmo recursivo requiere verificar que la condición de término se cumplirá en algún momento. En caso contrario, el algoritmo se llamará a sí mismo recursivamente hasta que el stack se agote y el programa colapse (error de ejecución). En este caso, la condición de término se alcanza cuando se logra llegar a la salida del laberinto o cuando se han probado todas las posibles direcciones (izquierda, derecha, arriba y abajo) y aún así no se ha encontrado solución. En este caso, el algoritmo recursivo se ha planteado de una forma bastante segura. El procedimiento siempre termina, ya sea positiva o negativamente, encontrando la solución o desistiendo de encontrarla, respectivamente. Por otra parte, es necesario definir dominios que caractericen situaciones distintas bajo las cuales se puede ejecutar el algoritmo. Dominios: Deben definirse dominios en los que, tanto la entrada como la salida del laberinto, se encuentren en distintas posiciones, incluso del mismo lado o hasta contiguas.

15 Validación: Ejecutando en algoritmo para los dominios definidos debe verificarse que la solución cumple con la especificación planteada y por lo tanto alcanza el objetivo propuesto. 5. Limitaciones del algoritmo A simple vista el algoritmo no tiene limitaciones importantes. Sin embargo, no existe una prueba formal de esto, por lo que se deja como ejercicio analizar la solución propuesta a fin de determinar potenciales limitaciones. Posibles modificaciones (Ejercicios) Existen diversas variantes de este programa que pueden implementarse como ejercicio. Algunas requieren leves modificaciones, principalmente en la función recursiva, pero otras involucran mayores cambios. Será posible eliminar los pasos innecesarios que puede provocar la función recursiva suministrada?. Si es así, modifique la función para que no haga esos pasos. El problema puede replantearse, indicando que el laberinto tiene una entrada y el objetivo es buscar algún tesoro que se encuentra en el interior, tomarlo y regresar a la entrada. Implemente la solución de este nuevo problema. La solución presentada no toma en cuenta la dirección en la que se viene buscando la solución. Puede implementarse una solución en la cual se mantenga la dirección actual, y la búsqueda se haga haciendo giros a partir de esa dirección. Tendría esto alguna ventaja?. Trate de implementar la solución. Será posible implementar una función recursiva que diseñe el laberinto?. Si lo logra concebir, impleméntela. Esto sustituiría la tediosa inicialización de la matriz y le daría mayor flexibilidad al programa. Ahora el programa plantea laberintos y luego los resuelve. Cuando se hayan estudiado bibliotecas para manejo de gráficos, será posible implementar una versión animada de la solución del laberinto, en la que se vayan mostrando los distintos caminos que va probando el algoritmo.

16 /********************************************************************** * Ejemplo: Solucion de un laberinto en forma recursiva. * Para mejor comprensión ver la descripción adjunta. **********************************************************************/ #include <stdio.h> /* Constantes que definen la dimension del laberinto */ #define FILAS 13 #define COLUMNAS 21 /* Caracteres que se almacenan en las posiciones del laberinto: */ /* ASCII 219 es un cuadro relleno que se usa para las paredes */ /* ' ' es un espacio en blanco, para los caminos libres */ /* '*' es la marca que senala las posiciones visitadas (camino) */ #define L 219 #define E ' ' #define MARCA '*' /* Constantes logicas para valor de retorno de funciones */ #define TRUE 1 #define FALSE 0 /* Matriz global que representa el laberinto. En la inicializacion, */ /* L representa un ladrillo en la pared y E un espacio en blanco */ int lab[filas][columnas] = { { L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, { E, E, E, L, E, L, E, L, E, L, E, E, E, L, E, E, E, E, E, E, L, { L, L, E, L, E, E, E, L, E, E, E, L, E, L, E, L, E, E, L, E, L, { L, E, E, E, E, L, E, L, L, L, E, L, E, L, E, L, L, E, L, E, L, { L, E, L, L, L, L, E, L, E, L, E, L, E, L, L, L, E, E, L, E, L, { L, E, E, E, L, E, E, L, E, L, E, L, E, E, E, E, E, L, L, E, L, { L, E, L, L, L, L, L, L, E, L, E, L, L, E, L, E, E, E, E, E, L, { L, E, E, E, E, E, E, E, E, E, E, E, L, E, L, E, L, L, E, L, L, { L, L, L, L, L, L, L, L, L, L, L, E, L, E, L, E, E, L, E, L, L, { L, E, E, E, E, E, E, E, L, E, E, E, L, L, L, L, L, L, E, L, L, { L, E, L, L, L, L, L, E, E, E, L, L, L, E, L, E, E, E, E, E, L, { L, E, E, L, E, E, E, E, L, E, E, L, E, E, E, E, L, L, L, E, E, { L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L ; /* Coordenadas de la entrada del laberinto */ int x0 = 1; int y0 = 0; /* Coordenadas de la salida del laberinto */ int xf = 11; int yf = 20; /********************************************************************** * Funcion que despliega el laberinto en su totalidad. **********************************************************************/

17 void desplegar() { int i, j; printf("\n"); for (i=0; i<filas; i++) { for (j=0; j<columnas; j++) { printf("%c", lab[i][j]); printf("\n"); return; /********************************************************************** * Analiza una posicion dentro del laberinto, especificada por la fila * y columna recibidas como parametro, y deduce si es una posicion * valida para recorrer. Basicamente debe verificar que no este fuera de * los limites del laberinto, que no se trate de una posicion en la que * hay pared, y que no se trate de una posicion previamente visitada. **********************************************************************/ int valida(int f, int c) { int resultado = TRUE; /* Se supone inicialmente valida */ /* Controla si la posicion esta fuera del laberinto */ if ((f<0) (f>=filas) (c<0) (c>=columnas)) resultado = FALSE; /* Controla si la posicion ya fue visitada o es muro */ if (lab[f][c] == MARCA lab[f][c] == L) resultado = FALSE; return(resultado); /********************************************************************** * Funcion recursiva que recorre el laberinto a partir de una posicion * dada por la fila y columna pasadas como parametro y devuelve un valor * booleano que indica si se logro llegar a la salida. El caso base de * la recursividad (condicion de termino) es que las coordenadas * correspondan con la salida del laberinto. En caso contrario, se * procede a marcar la casilla y a intentar en las distintas direcciones * (izquierda, derecha, arriba y abajo), asegurandose primero que en * esa direccion haya una casilla valida (no ladrillo, no fuera del * laberinto y no visitada). En caso en que ninguna direccion nos lleva * a la salida, se desmarca la casilla actual (pues se va a retroceder) * y se devuelve falso como valor de retorno. Las marcas sirven también * para senalar la ruta que conforma la solucion, una vez alcanzada. **********************************************************************/ int recorrer(int fil, int col) { int listo = FALSE; /* Indica si se ha encontrado la salida */ /* Se marca la casilla como visitada */ lab[fil][col] = MARCA; /* Se controla la condicion de termino de recursividad: */ /* " Llegamos a la salida? " */ if (fil == xf && col == yf) return(true); if (!listo && valida(fil,col-1)) /* Intento a la izquierda */ listo = recorrer(fil,col-1);

18 if (!listo && valida(fil,col+1)) /* Intento a la derecha */ listo = recorrer(fil,col+1); if (!listo && valida(fil-1,col)) /* Intento hacia arriba */ listo = recorrer(fil-1,col); if (!listo && valida(fil+1,col)) /* Intento hacia abajo */ listo = recorrer(fil+1,col); /* Si no se logro resolver el laberinto desde esta posicion, se */ /* desmarca la casilla pues no sera parte de la solucion. En este */ /* caso se retornara falso lo que provocara que se retroceda. */ if (!listo) lab[fil][col] = E; /* Se retorna TRUE/FALSE dependiendo de si se encontro solucion */ return(listo); /********************************************************************** * Funcion principal para la resolucion del laberinto. Se despliega * el laberinto antes y despues de resolverlo (encontrar el camino). **********************************************************************/ main() { int ok; /* Para saber si se obtuvo solucion */ desplegar(); /* Despliega el laberinto sin resolver */ /* Resuelve el laberinto desde la entrada: (x0,y0) */ ok = recorrer(x0,y0); if (!ok) /* Si no se pudo resolver se envia un mensaje */ printf("\nlaberinto sin solucion\n"); desplegar(); /* Despliega el laberinto resuelto (con el camino) */ Obsérvense los pasos innecesarios que se dan ( por qué ocurre?)

Problemas de Recursividad

Problemas de Recursividad Problemas de Recursividad Problema 1. El factorial de un número entero n 0, denotado como n!, se define! como!!! i = 1 2 n cuando n > 0, y 0! = 1. Por ejemplo 6! = 1 2 3 4 5 6 = 720 Diseñad una método

Más detalles

Programación Orientada a Objetos Métodos Guía de Ejercicios v9.7

Programación Orientada a Objetos Métodos Guía de Ejercicios v9.7 Programación Orientada a Objetos Métodos Guía de Ejercicios v9.7 1, Escriba un método llamado puntoscalidad que reciba como entrada el promedio de un estudiante y devuelva 4 si el promedio se encuentra

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

EJERCICIOS DE PROGRAMACIÓN EN C. DIBUJAR UN ROMBO O DIAMANTE. CALCULAR SUMATORIOS. (CU00542F)

EJERCICIOS DE PROGRAMACIÓN EN C. DIBUJAR UN ROMBO O DIAMANTE. CALCULAR SUMATORIOS. (CU00542F) APRENDERAPROGRAMAR.COM EJERCICIOS DE PROGRAMACIÓN EN C. DIBUJAR UN ROMBO O DIAMANTE. CALCULAR SUMATORIOS. (CU00542F) Sección: Cursos Categoría: Curso básico de programación en lenguaje C desde cero Fecha

Más detalles

Programación I. Práctica parcial: el juego de los barquitos (ENTREGA OBLIGATORIA)

Programación I. Práctica parcial: el juego de los barquitos (ENTREGA OBLIGATORIA) Programación I Práctica parcial: el juego de los barquitos (ENTREGA OBLIGATORIA) El objetivo de esta práctica es implementar una variedad del juego de los barquitos o hundir la flota. Como sabréis el juego

Más detalles

Soluciones a los ejercicios planteados en el curso

Soluciones a los ejercicios planteados en el curso Soluciones a los ejercicios planteados en el curso Unidad 3 - Algoritmos recursivos Lección 2 Mecanismo de recursividad Escribe un algoritmo recursivo que calcule el elemento de cardinal más elevado de

Más detalles

Tema 05: Tablas hash. M. en C. Edgardo Adrián Franco Martínez http://www.eafranco.com edfrancom@ipn.mx @edfrancom edgardoadrianfrancom

Tema 05: Tablas hash. M. en C. Edgardo Adrián Franco Martínez http://www.eafranco.com edfrancom@ipn.mx @edfrancom edgardoadrianfrancom Tema 05: Tablas hash M. en C. Edgardo Adrián Franco Martínez http://www.eafranco.com edfrancom@ipn.mx @edfrancom edgardoadrianfrancom (Prof. Edgardo A. Franco) 1 Contenido Tablas hash o de dispersión Función

Más detalles

Introducción a las sentencias de control

Introducción a las sentencias de control INSTRUCCIONES DE CONTROL CONTENIDOS 1. Introducción a las sentencias de control. 2. Instrucciones o sentencias condicionales: IF, IF-ELSE, SWITCH. 3. Instrucciones o sentencias repetitivas o iterativas:

Más detalles

Estructuras de control. Secuencial, condicional y repetitivas.

Estructuras de control. Secuencial, condicional y repetitivas. Estructuras de control. Secuencial, condicional y repetitivas. 1 Estructuras de control. Hemos visto en los diagramas de flujo y pseudo-código que: 1) Se piden datos de entrada (al usuario) Asiganción

Más detalles

Qué es la recursividad?

Qué es la recursividad? Recursividad 1 Ejemplo Matrushka La Matrushka es una artesanía tradicional rusa. Es una muñeca de madera que contiene otra muñeca más pequeña dentro de sí. Esta muñeca, también contiene otra muñeca dentro.

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

descripción del argumento identificador tipo longitud condición restricción

descripción del argumento identificador tipo longitud condición restricción Recuerde que estos son apuntes muy simplificados que deberá completar con la bibliografía PROGRAMACIÓN 0 Prof. Dolores Cuiñas H. recomendada APUNTES Nº. METODOLOGÍA PARA LA CONSTRUCCIÓN DE PROGRAMAS. Presentaremos

Más detalles

CAPITULO III: METODOLOGIA. En el presente capítulo se describirá el conjunto de pasos a seguir para lograr el

CAPITULO III: METODOLOGIA. En el presente capítulo se describirá el conjunto de pasos a seguir para lograr el CAPITULO III: METODOLOGIA En el presente capítulo se describirá el conjunto de pasos a seguir para lograr el objetivo propuesto en esta tesis. Primero se presenta la descripción general del programa y

Más detalles

Funciones & Estructuras de control

Funciones & Estructuras de control Funciones & Estructuras de control Universidad de Concepción, Chile Departamento de Geofísica Programación Científica con Software libre Primavera, 2011 Universidad de Concepción Contenidos 1 2 3 En la

Más detalles

UNIDAD I. ALGORITMOS

UNIDAD I. ALGORITMOS UNIDAD I. ALGORITMOS 1.1 Definición Un algoritmo es una serie de pasos organizados que describe el proceso que se debe seguir, para dar solución a un problema específico. 1.2 Tipos Cualitativos: Son aquellos

Más detalles

El lenguaje C. 3. Una instrucción que se ejecutará si la condición es verdadera.

El lenguaje C. 3. Una instrucción que se ejecutará si la condición es verdadera. Principios de Programación El lenguaje C 1. Instrucciones de control 1.1. Secuencia, selección, iteración Por lo regular en un programa los enunciados son ejecutados uno después del otro, en el orden en

Más detalles

4. Método Simplex de Programación Lineal

4. Método Simplex de Programación Lineal Temario Modelos y Optimización I 4. Método Simplex de Programación Lineal A- Resolución de problemas, no particulares, con representación gráfica. - Planteo ordenado de las inecuaciones. - Introducción

Más detalles

Polinomios. 1.- Funciones cuadráticas

Polinomios. 1.- Funciones cuadráticas Polinomios 1.- Funciones cuadráticas Definición 1 (Función polinomial) Sea n un entero no negativo y sean a n, a n 1,..., a, a 1, a 0 número s reales con a n 0. La función se denomina función polinomial

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

3. Métodos clásicos de optimización lineal

3. Métodos clásicos de optimización lineal 3. Métodos clásicos de optimización lineal Uso del método Simplex El problema que pretende resolverse es un problema de optimización lineal sujeto a restricciones. Para el modelo construido para el problema

Más detalles

Práctica 4: Funciones en lenguaje C/C++.

Práctica 4: Funciones en lenguaje C/C++. Práctica 4: Funciones en lenguaje C/C++. Objetivos En esta práctica el objetivo principal es el de poner en práctica los principios básicos del uso de funciones en lenguaje C/C++. Evaluación La práctica

Más detalles

CAPÍTULO 3: DETERMINANTES Y SISTEMAS DE ECUACIONES

CAPÍTULO 3: DETERMINANTES Y SISTEMAS DE ECUACIONES CAPÍTULO 3: DETERMINANTES Y SISTEMAS DE ECUACIONES Parte A: determinantes. A.1- Definición. Por simplificar, consideraremos que a cada matriz cuadrada se le asocia un número llamado determinante que se

Más detalles

INSTRUCCIONES PARA EL USO DEL SOFTWARE (IS)

INSTRUCCIONES PARA EL USO DEL SOFTWARE (IS) INSTRUCCIONES PARA EL USO DEL SOFTWARE (IS) Pantalla Inicial de DERIVE for Windows Teniendo instalado el programa DERIVE sobre Windows, podemos ingresar al sistema de las siguientes formas: Haciendo clic

Más detalles

Estructuración del programa en partes más pequeñas y sencillas

Estructuración del programa en partes más pequeñas y sencillas Introducción Estructuración del programa en partes más pequeñas y sencillas Modularización Propósito único Identificable Reusable Mayor claridad: programación, depuración, etc. Construcción de librerías

Más detalles

Tema 7: Polimorfismo. Índice

Tema 7: Polimorfismo. Índice Tema 7: Polimorfismo Antonio J. Sierra Índice Introducción. Sobrecarga de métodos. Objetos como parámetros. Paso de argumentos. Devolución de objetos. Recursividad. Control de acceso. Static. Final. Argumento

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

Programación 2 Ejercicios Resueltos del Práctico 1

Programación 2 Ejercicios Resueltos del Práctico 1 Solución del Ejercicio 3 Para resolver este problema se propone recorrer el arreglo f rase y comparar cada uno de los caracteres con el carácter buscado. En caso de coincidencia, se incrementa la variable

Más detalles

Tema 3. Estructuras de control

Tema 3. Estructuras de control Tema 3. Estructuras de control 3.1. Secuencial 3.2. Selección 3.3. Repetición 2 Objetivos Objetivos del tema: Conocer y saber la utilidad de las tres estructuras de control (secuencial, alternativa y repetitiva)

Más detalles

Recursividad. Dept. Ciencias de la Computación e I.A. Universidad de Granada

Recursividad. Dept. Ciencias de la Computación e I.A. Universidad de Granada TEMA Recursividad Dept. Ciencias de la Computación e I.A. Universidad de Granada Índice Introducción a la recursión Recursividad frente a iteración Eficiencia de los algoritmos recursivos Ejemplos y ejercicios

Más detalles

p(b, n) =b n, (b Z, n N) Esta definición matemática, recursiva, proporciona el procedimiento computacional

p(b, n) =b n, (b Z, n N) Esta definición matemática, recursiva, proporciona el procedimiento computacional Recursión e iteración Se exponen en este apartado diversos ejemplos simples de definiciones de procedimientos que generan procesos recursivos o iterativos. Se comienza precisando algoritmos y sus correspondientes

Más detalles

Recursión Directa. Una función es de recursión directa si contiene una llamada explícita a si misma. return foo (y 1); Recursión Indirecta

Recursión Directa. Una función es de recursión directa si contiene una llamada explícita a si misma. return foo (y 1); Recursión Indirecta Recursión Directa Una función es de recursión directa si contiene una llamada explícita a si misma int foo (int x) { if ( x

Más detalles

Programación 2. Lección 3. Introducción a la recursividad

Programación 2. Lección 3. Introducción a la recursividad Programación 2 Lección 3. Introducción a la recursividad 1 1. Definiciones recursivas Número natural y número entero Múltiplos de 7 Secuencia de datos Factorial de un número natural Sucesión de Fibonacci

Más detalles

Prof. Dr. Paul Bustamante

Prof. Dr. Paul Bustamante Prácticas de C++ Practica Nº 4 Fundamentos de Programación Informática II Prof. Dr. Paul Bustamante Practica Nº 4 Programación en C++ Pág. 1 ÍNDICE ÍNDICE... 1 1. Introducción... 1 1.1 Números Perfectos....

Más detalles

Descripción Identificador Tipo Condición El número num entero ninguna

Descripción Identificador Tipo Condición El número num entero ninguna Universidad de Los Andes Núcleo Universitario Alberto Adriani Programación Digital 10 Prof. Lisbeth Pérez Ejercicios Repetición a enviar el día 28 de mayo de 2011. Hora tope: 11.59pm Ejercicio 1: Escribir

Más detalles

Es evidente la continuidad en En el punto, se tiene:

Es evidente la continuidad en En el punto, se tiene: Tema 3 Continuidad Ejercicios Resueltos Ejercicio 1 Estudia la continuidad de la función La función puede expresarse como Para representarla basta considerar dos arcos de parábola: Es evidente la continuidad

Más detalles

JUNIO 2010. Opción A. 1 1.- Dada la parábola y = 3 área máxima que tiene un lado en la recta y los otros dos vértices en la gráfica de la parábola.

JUNIO 2010. Opción A. 1 1.- Dada la parábola y = 3 área máxima que tiene un lado en la recta y los otros dos vértices en la gráfica de la parábola. Junio 00 (Prueba Específica) JUNIO 00 Opción A.- Dada la parábola y 3 área máima que tiene un lado en la recta y los otros dos vértices en la gráfica de la parábola., y la recta y 9, hallar las dimensiones

Más detalles

MATEMÁTICAS I SUCESIONES Y SERIES

MATEMÁTICAS I SUCESIONES Y SERIES MATEMÁTICAS I SUCESIONES Y SERIES. Sucesiones En casi cualquier situación de la vida real es muy frecuente encontrar magnitudes que varían cada cierto tiempo. Por ejemplo, el saldo de una cuenta bancaria

Más detalles

4.1 Definición. Se dice que algo es recursivo si se define en función de sí mismo o a sí mismo. Un objeto (problemas, estructuras de datos) es

4.1 Definición. Se dice que algo es recursivo si se define en función de sí mismo o a sí mismo. Un objeto (problemas, estructuras de datos) es Recursividad 4.1 Definición. Se dice que algo es recursivo si se define en función de sí mismo o a sí mismo. Un objeto (problemas, estructuras de datos) es recursivo si forma parte de sí mismo o interviene

Más detalles

Etapas para la solución de un problema por medio del computador

Etapas para la solución de un problema por medio del computador Algoritmos. Definición Un algoritmo se puede definir como una secuencia de instrucciones que representan un modelo de solución para determinado tipo de problemas. O bien como un conjunto de instrucciones

Más detalles

Expresión, Operador, Operando, Asignación, Prioridad

Expresión, Operador, Operando, Asignación, Prioridad 4. EXPRESIONES Y OPERADORES Conceptos: Resumen: Expresión, Operador, Operando, Asignación, Prioridad En este tema se presentan los siguientes elementos de la programación: las expresiones y los operadores.

Más detalles

El lenguaje C. if (a>3) { printf("hola"); // bloque printf("%d",a); // de getch(); //código } Partes de un programa en C.

El lenguaje C. if (a>3) { printf(hola); // bloque printf(%d,a); // de getch(); //código } Partes de un programa en C. El lenguaje C El lenguaje C es uno de los lenguajes de programación estructurada más utilizados en nuestros días. El principal componente estructural de C es la función. En C, las funciones son bloques

Más detalles

Ejercicios del tema 5. Jerarquía de de Memoria

Ejercicios del tema 5. Jerarquía de de Memoria Ejercicios del tema 5. Jerarquía de de Memoria Ejercicio 1. Considere un computador de 32 bits con una caché de 64 KB asociativa por conjuntos de 4 vías y un tiempo de acceso de 4 ns. El tamaño de la línea

Más detalles

2. ENTIDADES PRIMITIVAS PARA EL DESARROLLO DE ALGORITMOS

2. ENTIDADES PRIMITIVAS PARA EL DESARROLLO DE ALGORITMOS 2. ENTIDADES PRIMITIVAS PARA EL DESARROLLO DE ALGORITMOS 2.1 Tipos De Datos Todos los datos tienen un tipo asociado con ellos. Un dato puede ser un simple carácter, tal como b, un valor entero tal como

Más detalles

Algoritmos y Diagramas de flujo

Algoritmos y Diagramas de flujo Algoritmos y Diagramas de flujo En los pasos a seguir para el desarrollo de un problema, existen básicamente dos tipos de elementos con los cuales es posible especificar un problema en forma esquemática

Más detalles

EJEMPLOS DE EJERCICIOS RESUELTOS

EJEMPLOS DE EJERCICIOS RESUELTOS EJEMPLOS DE EJERCICIOS RESUELTOS Veamos algunos ejemplos que utilicen los que ya sabemos de C++. Pero antes introduciremos, sin explicarlo en profundidad, dos elementos que nos permitirán que nuestros

Más detalles

METODO SIMPLEX ANALISIS DE SENSIBILIDAD Y DUALIDAD

METODO SIMPLEX ANALISIS DE SENSIBILIDAD Y DUALIDAD METODO SIMPLEX ANALISIS DE SENSIBILIDAD Y DUALIDAD Análisis de sensibilidad con la tabla simplex El análisis de sensibilidad para programas lineales implica el cálculo de intervalos para los coeficientes

Más detalles

LABORATORIO 5 FUNCIONES

LABORATORIO 5 FUNCIONES LABORATORIO 5 FUNCIONES 1 OBJETIVOS Al finalizar esta actividad, serás capaz de: Utilizar en la función main funciones matemáticas predefinidas. Entender que es posible aislar subtareas o subcálculos dentro

Más detalles

Los números naturales

Los números naturales Los números naturales Los números naturales Los números naturales son aquellos que sirven para contar. Se suelen representar utilizando las cifras del 0 al 9. signo suma o resultado Suma: 9 + 12 = 21 sumandos

Más detalles

4. " $#%&' (#) para todo $#* (desigualdad triangular).

4.  $#%&' (#) para todo $#* (desigualdad triangular). 10 Capítulo 2 Espacios Métricos 21 Distancias y espacios métricos Definición 211 (Distancia) Dado un conjunto, una distancia es una aplicación que a cada par le asocia un número real y que cumple los siguientes

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

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

Prof. Dr. Paul Bustamante

Prof. Dr. Paul Bustamante Nombre: Carné: Examen C++ - Junio Informática II Fundamentos de Programación Prof. Dr. Paul Bustamante Examen Grupo B Programación en C++ Pág. 1 ÍNDICE ÍNDICE... 1 1. Introducción.... 1 1.1 Ejercicio 1:

Más detalles

Declaración de variables (integer, single, double, boolean, etc.) en Visual Basic. Dim. Ejemplos. (CU00309A)

Declaración de variables (integer, single, double, boolean, etc.) en Visual Basic. Dim. Ejemplos. (CU00309A) aprenderaprogramar.com Declaración de variables (integer, single, double, boolean, etc.) en Visual Basic. Dim. Ejemplos. (CU00309A) Sección: Cursos Categoría: Curso Visual Basic Nivel I Fecha revisión:

Más detalles

Funciones II. Fundamentos de Programación Fundamentos de Programación I

Funciones II. Fundamentos de Programación Fundamentos de Programación I Funciones II Fundamentos de Programación Fundamentos de Programación I Ejercicio 1: Escribe una función que transforme un punto en coordenadas polares a cartesianas Entradas: Un punto como coordenadas

Más detalles

Algoritmos. Diseño de algoritmos por inducción. Alberto Valderruten. alberto.valderruten@udc.es. Dept. de Computación, Universidade da Coruña

Algoritmos. Diseño de algoritmos por inducción. Alberto Valderruten. alberto.valderruten@udc.es. Dept. de Computación, Universidade da Coruña Divide y Vencerás Diseño de algoritmos por inducción Dept. de Computación, Universidade da Coruña alberto.valderruten@udc.es Contenido Divide y Vencerás 1 Divide y Vencerás 2 Índice Divide y Vencerás 1

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

Tablas Hash y árboles binarios

Tablas Hash y árboles binarios Tablas Hash y árboles binarios Algoritmos Tablas hash Árboles Binarios Árboles Balanceados Tablas Hash Introducción Las tablas hash son estructuras tipo vector que ayudan a asociar claves con valores o

Más detalles

GUIA PRACTICA PARA LA APLICACIÓN DE MS EXCEL TECNOLOGIA/ INFORMATICA

GUIA PRACTICA PARA LA APLICACIÓN DE MS EXCEL TECNOLOGIA/ INFORMATICA Fórmulas y funciones De la barra de menú seleccionmos la opción insertar y haciendo clic en la opción f x se desplegará el siguiente cuadro de diálogo a partir del cual escogeremos la función adecuada

Más detalles

Curso Completo de Electrónica Digital. 3.7. Simplificación de funciones booleanas

Curso Completo de Electrónica Digital. 3.7. Simplificación de funciones booleanas CURSO Curso Completo de Electrónica Digital Departamento de Electronica y Comunicaciones Universidad Pontifica de Salamanca en Madrid Prof. Juan González Gómez Capítulo 3 ALGEBRA DE BOOLE Continuación...

Más detalles

Práctica 3. CÁLCULO DE LA FUNCIÓN SENO UTILIZANDO UN DESARROLLO EN SERIE

Práctica 3. CÁLCULO DE LA FUNCIÓN SENO UTILIZANDO UN DESARROLLO EN SERIE PROGRAMACIÓN (EUI). Curso 2001-2002 Práctica 3. CÁLCULO DE LA FUNCIÓN SENO UTILIZANDO UN DESARROLLO EN SERIE F. Marqués y N. Prieto Índice General 1 Introducción 1 2 El problema 1 2.1 Desarrollo en serie

Más detalles

Algoritmos. Medios de expresión de un algoritmo. Diagrama de flujo

Algoritmos. Medios de expresión de un algoritmo. Diagrama de flujo Algoritmos En general, no hay una definición formal de algoritmo. Muchos autores los señalan como listas de instrucciones para resolver un problema abstracto, es decir, que un número finito de pasos convierten

Más detalles

Lección 10: Representación gráfica de algunas expresiones algebraicas

Lección 10: Representación gráfica de algunas expresiones algebraicas LECCIÓN Lección : Representación gráfica de algunas epresiones algebraicas En la lección del curso anterior usted aprendió a representar puntos en el plano cartesiano y en la lección del mismo curso aprendió

Más detalles

SESIÓN 1 PRE-ALGEBRA, CONCEPTOS Y OPERACIONES ARITMÉTICAS BÁSICAS

SESIÓN 1 PRE-ALGEBRA, CONCEPTOS Y OPERACIONES ARITMÉTICAS BÁSICAS SESIÓN 1 PRE-ALGEBRA, CONCEPTOS Y OPERACIONES ARITMÉTICAS BÁSICAS I. CONTENIDOS: 1. Introducción: de la aritmética al álgebra. 2. Números reales y recta numérica. 3. Operaciones aritméticas básicas con

Más detalles

PROGRAMACIÓN ALGORITMOS y DIAGRAMAS

PROGRAMACIÓN ALGORITMOS y DIAGRAMAS PROGRAMACIÓN ALGORITMOS y DIAGRAMAS ALGORITMO DEFINICIÓN: CONSISTE EN LA DESCRIPCIÓN CLARA Y DETALLADA DEL PROCEDIMIENTO A SEGUIR PARA ALCANZAR LA SOLUCIÓN A UN PROBLEMA ESTABLECIENDOSE UNA SECUENCIA DE

Más detalles

Trabajo Práctico Nº 06

Trabajo Práctico Nº 06 Tema: Recursividad 1. Dado el siguiente método: static int puzle (int base, int limite) if (base > limite) return -1; if (base = = limite) return base * puzle(base+1,limite); 1.1 Identificar: a) el caso(s)

Más detalles

Manual del Usuario de Microsoft Access Consultas - Página 1. Tema IV: Consultas. IV.1. Creación de Consultas

Manual del Usuario de Microsoft Access Consultas - Página 1. Tema IV: Consultas. IV.1. Creación de Consultas Manual del Usuario de Microsoft Access Consultas - Página 1 Tema IV: Consultas IV.1. Creación de Consultas La potencia real de una base de datos reside en su capacidad para mostrar los datos que se desea

Más detalles

Vectores y Matrices. Tema 3: Repaso de Álgebra Lineal Parte I. Contenidos

Vectores y Matrices. Tema 3: Repaso de Álgebra Lineal Parte I. Contenidos Tema 3: Repaso de Álgebra Lineal Parte I Virginia Mazzone Contenidos Vectores y Matrices Bases y Ortonormailizaciòn Norma de Vectores Ecuaciones Lineales Algenraicas Ejercicios Vectores y Matrices Los

Más detalles

Sistemas de Ecuaciones Lineales

Sistemas de Ecuaciones Lineales Sistemas de Ecuaciones Lineales 1 Sistemas de ecuaciones y matrices Definición 1 Una ecuación lineal en las variables x 1, x 2,..., x n es una ecuación de la forma con a 1, a 2... y b números reales. a

Más detalles

Tema 1. Álgebra lineal. Matrices

Tema 1. Álgebra lineal. Matrices 1 Tema 1. Álgebra lineal. Matrices 0.1 Introducción Los sistemas de ecuaciones lineales aparecen en un gran número de situaciones. Son conocidos los métodos de resolución de los mismos cuando tienen dos

Más detalles

RSA: Implementación. Ya resolvimos (3), ahora vamos a resolver (2). IIC3242 Complejidad Probabiĺıstica 28 / 77

RSA: Implementación. Ya resolvimos (3), ahora vamos a resolver (2). IIC3242 Complejidad Probabiĺıstica 28 / 77 RSA: Implementación Para poder implementar RSA necesitamos algoritmos eficientes para los siguientes problemas: (1) Generar primos P y Q (2) Generar números e y d tales que e d modφ(n) = 1 (3) Calcular

Más detalles

Determinantes. Primera definición. Consecuencias inmediatas de la definición

Determinantes. Primera definición. Consecuencias inmediatas de la definición Determinantes Primera definición Para calcular el determinante de una matriz cuadrada de orden n tenemos que saber elegir n elementos de la matriz de forma que tomemos solo un elemento de cada fila y de

Más detalles

CURSOSO. Aritmética: Númerosnaturalesyenteros. Númerosracionalesyfraciones. MATEMÁTICAS. AntonioF.CostaGonzález

CURSOSO. Aritmética: Númerosnaturalesyenteros. Númerosracionalesyfraciones. MATEMÁTICAS. AntonioF.CostaGonzález CURSOSO CURSOSO MATEMÁTICAS Aritmética: Númerosnaturalesyenteros. Númerosracionalesyfraciones. AntonioF.CostaGonzález DepartamentodeMatemáticasFundamentales FacultaddeCiencias Índice 1 Introducción y objetivos

Más detalles

Programación 2. Grado en Estadística Aplicada. Curso 2012-2013. Generación de números pseudoaleatorios. Manejo de ficheros de texto.

Programación 2. Grado en Estadística Aplicada. Curso 2012-2013. Generación de números pseudoaleatorios. Manejo de ficheros de texto. Programación 2 Grado en Estadística Aplicada Curso 2012-2013 Generación de números pseudoaleatorios. Manejo de ficheros de texto. Jesús Correas jcorreas@fdi.ucm.es Departamento de Sistemas Informáticos

Más detalles

Diseñar un algoritmo que lea 3 números e imprima el mayor y el menor valor de los tres. La

Diseñar un algoritmo que lea 3 números e imprima el mayor y el menor valor de los tres. La Diseñar un algoritmo que lea 3 números e imprima el mayor y el menor valor de los tres. La ALGORITMO MAXMIN_3; entero A, B, C, MAX, MIN; LEER A, B, C; SI A < B ENTONCES SI A < C ENTONCES MIN = A; SI B

Más detalles

Derivadas Parciales y Derivadas Direccionales

Derivadas Parciales y Derivadas Direccionales Tema 3 Derivadas Parciales y Derivadas Direccionales En este tema y en el siguiente presentaremos los conceptos fundamentales del Cálculo Diferencial para funciones de varias variables. Comenzaremos con

Más detalles

PRUEBA DE NIVEL DE ACCES

PRUEBA DE NIVEL DE ACCES PRUEBA DE NIVEL DE ACCES NOMBRE Y APELLIDOS:... 1. Microsoft Access es: Una base de datos relacional. Una base de datos no relacional. Una base de datos documental. Ninguna de las afirmaciones es correcta.

Más detalles

Manual de Mensajes Recibidos Swift

Manual de Mensajes Recibidos Swift Manual de Mensajes Recibidos Swift Índice Manual de Mensajes Recibidos Swift. Introducción... 2. Descripción del Servicio.... Características... 4. Acceso... 5. Consulta de Saldos... 6. Consulta de Movimientos

Más detalles

INSTITUTO SUPERIOR DE FORMACIÓN TÉCNICA Nº 177

INSTITUTO SUPERIOR DE FORMACIÓN TÉCNICA Nº 177 INSTITUTO SUPERIOR DE FORMACIÓN TÉCNICA Nº 177 Instrucción condicional if else Uso de la estructura condicional Ejemplos con diagramas de flujo y codificación wdcarnero@gmail.com LA INSTRUCCIÓN CONDICIONAL

Más detalles

Ejercicio ejemplo resuelto de uso de arrays (arreglos) dinámicos en pseudocódigo I (CU00214A)

Ejercicio ejemplo resuelto de uso de arrays (arreglos) dinámicos en pseudocódigo I (CU00214A) aprenderaprogramar.com Ejercicio ejemplo resuelto de uso de arrays (arreglos) dinámicos en pseudocódigo I (CU00214A) Sección: Cursos Categoría: Curso Bases de la programación Nivel II Fecha revisión: 2024

Más detalles

LENGUAJES DE PROGRAMACION I. Propósito del curso :

LENGUAJES DE PROGRAMACION I. Propósito del curso : UNIVERSIDAD AUTÓNOMA DE CHIHUAHUA Clave: 08MSU0017H Clave: 08USU4053W FACULTAD DE INGENIERÍA PROGRAMA DEL CURSO: LENGUAJES DE PROGRAMACION I DES: Ingeniería Ingeniería en Sistemas Programa(s) Educativo(s):

Más detalles

Los números enteros. > significa "mayor que". Ejemplo: 58 > 12 < significa "menor que". Ejemplo: 3 < 12 Cualquier número positivo siempre es mayor

Los números enteros. > significa mayor que. Ejemplo: 58 > 12 < significa menor que. Ejemplo: 3 < 12 Cualquier número positivo siempre es mayor Los números enteros Los números enteros Los números enteros son aquellos que permiten contar tanto los objetos que se tienen, como los objetos que se deben. Enteros positivos: precedidos por el signo +

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

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

Algoritmo, Estructuras y Programación I Ing. Marglorie Colina

Algoritmo, Estructuras y Programación I Ing. Marglorie Colina Unidad II: Fundamentos de la Programación Estructurada Algoritmo, Estructuras y Programación I Ing. Marglorie Colina Estructura General de un Programa Zona de ficheros de cabecera de las librerías Zona

Más detalles

Tema 1. Recursividad

Tema 1. Recursividad Tema 1. Recursividad Análisis y Diseño de Algoritmos ESCUELA TÉCNICA SUPERIOR DE INGENIERÍA INFORMÁTICA Departamento de Lenguajes y Sistemas Informáticos Curso 2010-2011 Índice 1. Concepto 2. Tipos de

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

PROBABILIDAD Y ESTADÍSTICA. Sesión 5 (En esta sesión abracamos hasta tema 5.8)

PROBABILIDAD Y ESTADÍSTICA. Sesión 5 (En esta sesión abracamos hasta tema 5.8) PROBABILIDAD Y ESTADÍSTICA Sesión 5 (En esta sesión abracamos hasta tema 5.8) 5 DISTRIBUCIONES DE PROBABILIDAD CONTINUAS Y MUESTRALES 5.1 Distribución de probabilidades de una variable aleatoria continua

Más detalles

MENORES, COFACTORES Y DETERMINANTES

MENORES, COFACTORES Y DETERMINANTES MENORES, COFACTORES Y DETERMINANTES 1. Introducción. 2. Determinante de una matriz de 3 x 3. 3. Menores y cofactores. 4. Determinante de una matriz de n x n. 5. Matriz triangular. 6. Determinante de una

Más detalles

Sentencias iterativas

Sentencias iterativas Sentencias iterativas 1. Objetivos Al finalizar esta actividad, serás capaz de: 1. Utilizar adecuadamente la sentencia while para generar la repetición en la ejecución de grupos de sentencias 2. Motivación

Más detalles

TECNICAS DE PROGRAMACION Universidad Católica Los Angeles de Chimbote RECURSIVIDAD Y SOBRECARGA DE METODOS

TECNICAS DE PROGRAMACION Universidad Católica Los Angeles de Chimbote RECURSIVIDAD Y SOBRECARGA DE METODOS RECURSIVIDAD Y SOBRECARGA DE METODOS RECURSIVIDAD Un método es recursivo cuando se llama a si mismo ya sea directamente e indirectamente. Si un método recursivo se invoca con un caso base, simplemente

Más detalles

Problemas de 4 o ESO. Isaac Musat Hervás

Problemas de 4 o ESO. Isaac Musat Hervás Problemas de 4 o ESO Isaac Musat Hervás 5 de febrero de 01 Índice general 1. Problemas de Álgebra 7 1.1. Números Reales.......................... 7 1.1.1. Los números....................... 7 1.1.. Intervalos.........................

Más detalles

DESCOMPOSICIÓN FACTORIAL

DESCOMPOSICIÓN FACTORIAL 6. 1 UNIDAD 6 DESCOMPOSICIÓN FACTORIAL Objetivo general. Al terminar esta Unidad resolverás ejercicios y problemas en los que apliques la factorización de polinomios cuyos términos tienen coeficientes

Más detalles

Herramientas digitales de auto-aprendizaje para Matemáticas

Herramientas digitales de auto-aprendizaje para Matemáticas real de con Herramientas digitales de auto-aprendizaje para Matemáticas, Grupo de Innovación Didáctica Departamento de Matemáticas Universidad de Extremadura real de con Índice real de con real de con.

Más detalles

Pruebas de Acceso a Enseñanzas Universitarias Oficiales de Grado (PAEG) Matemáticas aplicadas a las Ciencias Sociales II - Junio 2011 - Propuesta B

Pruebas de Acceso a Enseñanzas Universitarias Oficiales de Grado (PAEG) Matemáticas aplicadas a las Ciencias Sociales II - Junio 2011 - Propuesta B Pruebas de Acceso a Enseñanzas Universitarias Oficiales de Grado (PAEG) Matemáticas aplicadas a las Ciencias Sociales II - Junio 2011 - Propuesta B 1. Queremos invertir una cantidad de dinero en dos tipos

Más detalles

UNIDAD III 3.2 USO DE FUNCIONES MATEMÁTICAS LÓGICAS Y DE BUSQUEDA

UNIDAD III 3.2 USO DE FUNCIONES MATEMÁTICAS LÓGICAS Y DE BUSQUEDA EXCEL BASICO UNIDAD III 3.2 USO DE FUNCIONES MATEMÁTICAS LÓGICAS Y DE BUSQUEDA Autor: M.T.E Silvia M. Hernández Hermosillo Actualización: Lic. Angélica Sánchez Ángeles 3.1 FORMATOS DE NUMEROS Se pueden

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

CAPITULO II. ENTIDADES PRIMITIVAS PARA EL DESARROLLO DE ALGORITMOS

CAPITULO II. ENTIDADES PRIMITIVAS PARA EL DESARROLLO DE ALGORITMOS CAPIULO II. ENIDADES PRIMIIVAS PARA EL DESARROLLO DE ALGORIMOS 2.1 ipos de datos 2.2 Expresiones 2.3 Operadores y operandos 2.4 Identificadores como localidades de memoria OBJEIVO EDUCACIONAL: El alumno:

Más detalles

Contenido. Página 2 de 8

Contenido. Página 2 de 8 RÚBRICA Contenido INTRODUCCIÓN... 3 CONFIGURACIÓN Y GESTIÓN DE UNA RÚBRICA... 3 Definir un nuevo formulario de calificación desde cero, para crear un nuevo formulario desde cero... 4 Crear un nuevo formulario

Más detalles

Dada la proporción =, calcula el producto de extremos menos el producto de medios. 4. Halla los determinantes de las siguientes matrices: Solución:

Dada la proporción =, calcula el producto de extremos menos el producto de medios. 4. Halla los determinantes de las siguientes matrices: Solución: 3 Determinantes. Determinantes de orden y 3 por Sarrus Piensa y calcula 3 6 Dada la proporción =, calcula el producto de extremos menos el producto de medios. 4 8 3 8 6 4 = 4 4 = 0 Aplica la teoría. Calcula

Más detalles