Está en la página 1de 15

Informática I - Ciclo lectivo 2023

Esp. Ing. Sebastian M. Vicario


svicario@frp.utn.edu.ar

Universidad Tecnológica Nacional


Facultad Regional Paraná
Cátedra de Informática I

7 de agosto de 2023

1 / 15 Esp. Ing. Sebastian M. Vicario Informática I - Ciclo lectivo 2023


Evaluaciones

Lo que se viene

Entrega Trabajo Práctico I: esta semana

Recuperatorio Parcial I - 14/08/2023

2 / 15 Esp. Ing. Sebastian M. Vicario Informática I - Ciclo lectivo 2023


Recursividad

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.

La recursividad es un concepto fundamental en matemáticas y en computación. Una


definición recursiva dice cómo obtener conceptos nuevos empleando el mismo concepto
que intenta describir.

Ejemplo 1: La función factorial, n! (para enteros no negativos)



1 n=0
fact(n) =
n ∗ fact(n − 1) n > 0
Ejemplo 2: La definición de números naturales.
1 es un número natural.
Todo sucesor de un número natural es otro número natural.

3 / 15 Esp. Ing. Sebastian M. Vicario Informática I - Ciclo lectivo 2023


Recursividad

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

Ejemplo 4: El producto de dos números enteros positivos A y B



A B=1
A.B =
A + A.(B − 1) B > 1

Varios subproblemas que se han pensado anteriormente como iterativos se pueden ana-
lizar desde el punto de vista de la recursividad.

Un subprograma que se llama a sı́ mismo se dice que es recursivo.

4 / 15 Esp. Ing. Sebastian M. Vicario Informática I - Ciclo lectivo 2023


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 1: Origen Diccionario de Lengua Española ITER Duplex – Sopena


Muchedumbre: f. Multitud
Multitud: f. Muchedumbre

Ejemplo 2: “La vida es una muerte que viene. La muerte es una vida vivida.” (Jorge
Luis Borges)

5 / 15 Esp. Ing. Sebastian M. Vicario Informática I - Ciclo lectivo 2023


Recursividad

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.

6 / 15 Esp. Ing. Sebastian M. Vicario Informática I - Ciclo lectivo 2023


Recursividad

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.

Los ejemplos mencionados en recursividad indirecta no presentan la condición de sali-


da. Por lo tanto los podemos tomar también como ejemplos de definiciones recursivas
incorrectas.

7 / 15 Esp. Ing. Sebastian M. Vicario Informática I - Ciclo lectivo 2023


Recursividad

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

8 / 15 Esp. Ing. Sebastian M. Vicario Informática I - Ciclo lectivo 2023


Recursividad

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

El acceso de la función no presenta diferencias, la función recursiva se puede llamar


desde cualquier expresión o desde cualquier lugar donde se acepte una invocación a una
función de otro tipo.

9 / 15 Esp. Ing. Sebastian M. Vicario Informática I - Ciclo lectivo 2023


Recursividad

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

Los algoritmos recursivos son particularmente apropiados cuando el problema a resolver


(o los datos a tratar) se definen en forma recursiva. Las soluciones recursivas en general
son más simples y ofrecen soluciones sencillas a problemas complejos.

10 / 15 Esp. Ing. Sebastian M. Vicario Informática I - Ciclo lectivo 2023


Recursividad

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)

Los primeros valores de esta sucesión son: 1, 1, 2, 3, 5, 8, 13, 21, ...


Utilizaremos la función clock a fin de determinar el tiempo requerido para generar los
términos de esta sucesión con implementaciones recursivas e iterativas.
ej04

11 / 15 Esp. Ing. Sebastian M. Vicario Informática I - Ciclo lectivo 2023


Ámbito de variables

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.

12 / 15 Esp. Ing. Sebastian M. Vicario Informática I - Ciclo lectivo 2023


Modificadores

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

13 / 15 Esp. Ing. Sebastian M. Vicario Informática I - Ciclo lectivo 2023


Modificadores

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

14 / 15 Esp. Ing. Sebastian M. Vicario Informática I - Ciclo lectivo 2023


Fin

15 / 15 Esp. Ing. Sebastian M. Vicario Informática I - Ciclo lectivo 2023

También podría gustarte