Documentos de Académico
Documentos de Profesional
Documentos de Cultura
7 de agosto de 2023
Lo que se viene
Introducción
Se dice que un objeto o proceso es recursivo, si en parte está formado por sı́ mismo o
se define en función de si mismo.
Introducción
Ejemplo 3: Potencia entera N (N ⩾ 0) de un número real X no nulo.
1 n=0
xn =
x ∗ x (n−1) n > 0
Varios subproblemas que se han pensado anteriormente como iterativos se pueden ana-
lizar desde el punto de vista de la recursividad.
Tipos de recursión
La recursión en los subprogramas puede darse de dos maneras diferentes:
Directa: el sub programa se llama directamente a sı́ mismo.
Indirecta: sean dos subprogramas, llamados A y B. El subprograma A llama al B,
y este último al primero.
Los ejemplos anteriores son casos de recursión directa. Algunos ejemplos de recursión
indirecta son:
Ejemplo 2: “La vida es una muerte que viene. La muerte es una vida vivida.” (Jorge
Luis Borges)
Implementación
Una implementación recursiva es correcta cuando se cumple con las condiciones siguien-
tes:
Contiene una condición que evite continuar la recursión cuando se haya alcanzado
el estado final.
Se llega si o si al estado final.
Cuando se llega al estado final se debe haber completado el cálculo correcto.
Implementación
La primer caracterı́stica es sumamente importante, las definiciones recursivas correctas
tienen siempre una condición de salida llamada “caso base”, de resolución directa,
generalmente muy simple y no recursiva.
Implementación
Consideremos nuevamente el cálculo del factorial de un número entero. Una implemen-
tación utilizando funciones recursivas es:
1 int iFact ( int iN )
2 {
3 int ret ;
4 if ( iN == 0)
5 ret = 1 ;
6 else
7 ret = iN * iFact ( iN - 1);
8 return ret ;
9 }
En las lı́neas 4 y 5 se resuelve el caso base, mientras que en la lı́nea 7 se tiene la
invocación asociada a la recursión.
ej01 ej02 ej03
Implementación
La definición de funciones recursivas es similar a las funciones que hemos utilizado
anteriormente. La única diferencia es que en su definición se utiliza la misma función
que todavı́a no ha terminado de definirse
Detalles de implementación
Cuando se ejecuta una función recursiva, salvo cuando se ejecute el “caso base”, la
misma se activará nuevamente. Con cada llamada recursiva se crea una copia de todas
las variables que se utilicen, además se guarda una referencia a la siguiente instrucción
a ejecutar. Esto continua ası́ hasta que se ejecute la condición de salida.
Por esto, en general, las soluciones recursivas suelen utilizar más tiempo y recursos
que las soluciones iterativas. A tal punto que ocasionalmente pueden alcanzar el lı́mite
de memoria disponible y generar un error irrecuperable. Este es conocido como stack
overflow o desbordamiento de pila.
ej07
Detalles de implementación
Dentro de las soluciones recursivas se encuentra un caso cuya ineficiencia se magnifica.
Es aquel en el cual un subprograma se llama a si mismo dos o más veces.
Un ejemplo de este caso es la implementación recursiva para la obtención de la sucesión
de Fibonacci. Esta se define como:
F (1) = 1
F (2) = 1
F (3) = F (2) + F (1)
...
F (N) = F (N − 1) + F (N − 2)
Concepto
El ámbito, o visibilidad, de una variable nos indica en qué lugares del programa está
activa esa variable.
El ámbito de las variables depende de dónde han sido declaradas y si se les ha aplicado
algún modificador
¿Donde se declaró?
Dentro de una función (Variable Local)
Solo existe y puede ser accedida dentro de la función.
Fuera de toda función (Variable Global)
Sólo será visible en las funciones definidas después de su declaración.
Modificadores de variables
Al momento de definir una variable, es posible indicar atributos adicionales, que modi-
fican su comportamiento.
auto
Es un atributo implı́cito en las variables locales e indica que las funciones se crean
al inicio de la ejecución de la función y se destruyen al final. Esta creación y
destrucción está asociada al uso y liberación de memoria del stack.
extern
Indica al compilador que se hará referencia a una variable que se encuentra definida
en un módulo diferente al que se está compilando. Permite que desde diferentes
archivos se pueda utilizar una misma variable.
static
Tiene diferentes sentidos:
En variables locales: la variable asociada existirá más allá de la invocación a la función.
Se comportará, respecto de su ciclo de vida, como una variable global pero solo podrá
ser accedida en su espacio de definición.
En variables globales: la variable no podrá ser accedida desde otro archivo de código
fuente.
.
Modificadores de variables
register
Solo es aplicable únicamente a variables locales e indica al compilador que esta
variable debe ser almacenada permanentemente en un registro del procesador del
ordenador.
volatile
Si una variable es definida a fin de ser accedida desde diferentes archivos, en algunos
casos (cuando se utilizan interrupciones por ejemplo), debido a optimizaciones que
realiza el compilador, puede darse que al acceder a su contenido se tengan diferentes
valores en función del archivo desde donde se la utiliza. Para resolver esto y lograr
que tenga el mismo valor en todos los espacios donde se la utiliza puede utilizarse
el modificador volatile.
ej06