Tema 2: Recursividad

Anuncio
Tema 2:
Recursividad
Estructura de datos y de
la Información
Facultad de Informática
Facultad de Informática
La pila y los registros de activación
• Cada vez que se hace una llamada a una rutina (procedimiento o función)
se crea un registro de activación.
• Un registro de activación es un trozo de memoria donde se guardan los
valores de las constantes, variables y parámetros por valor de la rutina que
se está ejecutando.
• Además, si una rutina A tiene entre sus instrucciones una llamada a la
rutina B, la ejecución de A se para en la instrucción donde se genera la
llamada a B y se guarda, en su correspondiente registro de activación, la
dirección de la instrucción de retorno junto a los datos que manejaba hasta
ese momento.
• En el momento en que finaliza la ejecución de una rutina, su registro de
activación se destruye.
• Finalmente, todos los registros de activación se almacenan en un segmento
de la memoria del ordenador llamado Stack o Pila.
© 2005
Tema 2: Recursividad
2
Facultad de Informática
Recursividad: proceso de llamadas
• Supongamos que tenemos el siguiente código recursivo:
function Factorial (n: integer): integer;
begin
if n = 0
then
Factorial := 1
else
Factorial := n * Factorial(n-1);
end;
Instrucción de
retorno R2
• Veamos a continuación cómo funcionaría la llamada
Resultado := Factorial (3);
© 2005
Tema 2: Recursividad
Instrucción de
retorno R1
3
Facultad de Informática
Estado de la pila
Factorial (3)
Resultado
n
Dir. retorno
?
3
R1
Primera
llamada
Memoria
Registro de
activación
© 2005
(Pila Recursiva)
Tema 2: Recursividad
4
Facultad de Informática
Estado de la pila
Factorial (3) = 3 * Factorial(2)
Resultado
n
Dir. retorno
?
2
R2
?
3
R1
Segunda
llamada
Primera
llamada
Memoria
© 2005
Tema 2: Recursividad
5
Facultad de Informática
Estado de la pila
Factorial (2) = 2 * Factorial(1)
Resultado
n
Dir. retorno
?
1
R2
?
2
R2
?
3
R1
Tercera
llamada
Segunda
llamada
Primera
llamada
Memoria
© 2005
Tema 2: Recursividad
6
Facultad de Informática
Factorial (1) = 1 * Factorial(0)
Resultado
Estado de la pila
n
Dir. retorno
1
0
R2
?
1
R2
?
2
R2
?
3
R1
Cuarta
llamada
Tercera
llamada
Segunda
llamada
Primera
llamada
Memoria
© 2005
Tema 2: Recursividad
7
Facultad de Informática
Estado de la pila
Retorno
Resultado
n
Dir. retorno
1
1
R2
?
2
R2
?
3
R1
Tercera
llamada
Segunda
llamada
Primera
llamada
Memoria
© 2005
Tema 2: Recursividad
8
Facultad de Informática
Estado de la pila
Retorno
Resultado
n
Dir. retorno
1
2
R2
?
3
R1
Segunda
llamada
Primera
llamada
Memoria
© 2005
Tema 2: Recursividad
9
Facultad de Informática
Estado de la pila
Retorno
Resultado
n
Dir. retorno
2
3
R1
Primera
llamada
Memoria
© 2005
Tema 2: Recursividad
10
Facultad de Informática
Fin
• Finalmente, acabaría la ejecución de la llamada Factorial(3) y retornaría a
la instrucción inicial R1
Resultado
n
Dir. retorno
2
3
R1
Resultado := 6
Memoria
© 2005
Tema 2: Recursividad
11
Descargar