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

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 0 */ printf("Ingrese el numero de elementos: "); scanf("%d", &n); } for (i=0; i= 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

0 downloads 104 Views 161KB Size

Recommend Stories


Secuencias definidas de manera recursiva
LECCIÓN Secuencias definidas de manera recursiva CONDENSADA 1.1 En esta lección ● ● ● escribirás definiciones y fórmulas recursivas para patrones

El libro está organizado de la siguiente manera:
Nueva historia económica de Colombia Salomón Kalmanovitz (editor) Con la colaboración de Edwin López Rivera, Enrique López Enciso, Carlos Brando, Carl

Puede extraer subcadenas y concatenar cadenas de la siguiente manera: string s1 = "orange"; string s2 = "red";
Una cadena de C# es una matriz de caracteres que se declara utilizando la palabra clave string. Un literal de cadena se declara utilizando las comillas, como se muestra en el siguiente ejemplo: string s = "Hello, World!"; Puede extraer subcadenas y c

PLAN DE REDACCIÒN. Utilizando el método T+Doce podemos resolver el ejercicio de la siguiente manera:
GUÍA DE PSU DE LENGUAJE PROFESOR Diego Alfaro Palma Objetivo: Identificar y aplicar el método T+DOCE PLAN DE REDACCIÒN Método T+Doce para resolver ej

Story Transcript

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 0 */ printf("Ingrese el numero de elementos: "); scanf("%d", &n); } for (i=0; i= 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 Algoritmos y Estructura de datos

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:

Algoritmos y Estructura de datos

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: Algoritmos y Estructura de datos

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

Algoritmos y Estructura de datos

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 3.1. Cambiar resultado a FALSO Código en C: int valida(int f, int c) { int resultado = TRUE; /* Se supone inicialmente valida */ /* Controla si la posicion esta fuera del laberinto */ if ((f

Get in touch

Social

© Copyright 2013 - 2024 MYDOKUMENT.COM - All rights reserved.