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