Recurrencia Programación II de enero de 2009
Recurrencia Un concepto es recursivo si está definido a partir de su mismo Cada definición recursiva tiene un caso base y un caso recursivo Una función recursiva llama a su misma con otros valores de entrada Mayor dificultad: encontrar la definición recursiva
Ejemplo: Factorial funcion Factorial(n:natural) devuelve natural si (n=0) entonces devuelve 1;caso base sino devuelve n*Factorial(n-1); fsi ffuncioncaso recursivo
Ejecución ¿Qué pasa cuando ejecutamos una función recursiva? –relacionado con la ejecución de programas en general –ayuda en la interpretación de funciones recursivas Vamos a estudiar un modelo simplificado de la máquina
La pila La máquina mantiene una pila para controlar la ejecución Cada elemento en la pila es un registro de activación Cuando el código entra en un bloque, se añade un elemento Cuando sale, se remueve Registro 4 Registro 3 Registro 2 Registro 1
Registro de activación Cada registro de activación contiene los siguientes componentes: –Parámetros –Variables locales/resultados intermedios –Resultado final Cada componente puede ser de valor o de referencia
Referencia Un parámetro, una variable o el resultado de una función puede ser de referencia –Ejemplo: puntero en C Una referencia no contiene el valor mismo En cambio, contiene la dirección a la ubicación en memoria donde halla el valor int c=5; int *d=&c; c 5 d
Ejemplo: Factorial Suponemos que queremos saber cuál es el resultado de Factorial(3) Usamos el modelo de la pila para analizar la llamada Factorial(3) Introducimos los registros de activación correspondientes
Ejemplo: Factorial Factorial(3)
Ejemplo: Factorial Factorial(3) n 3 Factorial(n-1) Resultado
Ejemplo: Factorial Factorial(3) n 3 Factorial(n-1) Resultado n 2 Factorial(n-1) Resultado
Ejemplo: Factorial n 1 Factorial(n-1) Resultado Factorial(3) n 3 Factorial(n-1) Resultado n 2 Factorial(n-1) Resultado
Ejemplo: Factorial n 1 Factorial(n-1) Resultado n 2 Factorial(n-1) Resultado Factorial(3) n 3 Factorial(n-1) Resultado n 0 Factorial(n-1) Resultado
Ejemplo: Factorial n 1 Factorial(n-1) 1 Resultado n 2 Factorial(n-1) Resultado Factorial(3) n 3 Factorial(n-1) Resultado n 0 Factorial(n-1) Resultado
Ejemplo: Factorial n 1 Factorial(n-1) 1 Resultado Factorial(3) n 3 Factorial(n-1) Resultado n 2 Factorial(n-1) 1 Resultado
Ejemplo: Factorial Factorial(3) n 3 Factorial(n-1) 2 Resultado n 2 Factorial(n-1) 1 Resultado
Ejemplo: Factorial Factorial(3) 6 n 3 Factorial(n-1) 2 Resultado
Ejemplo: Factorial Factorial(3) 6
Ejercicio 1.5 Escribir una función recursiva EsPrimo que devuelve si o no un número natural n es primo Usar la pila para interpretar el resultado de EsPrimo(5)
Ejercicio 1.5 funcion EsPrimo(n:natural) devuelve booleano devuelve Primo(n,2); ffuncion
Ejercicio 1.5 funcion Primo(n,k:natural) devuelve booleano si (k >= n) entonces devuelve cierto; sino si (n mod k = 0) entonces devuelve falso; sino devuelve Primo(n,k+1); fsi ffuncion
Ejercicio 1.5 EsPrimo(5)
Ejercicio 1.5 EsPrimo(5) n 5 Primo(n,2) Resultado
Ejercicio 1.5 EsPrimo(5) n 5 Primo(n,2) Resultado n 5 k 2 Primo(n,k+1) Resultado
Ejercicio 1.5 n 5 k 2 Primo(n,k+1) Resultado EsPrimo(5) n 5 Primo(n,2) Resultado n 5 k 3 Primo(n,k+1) Resultado
Ejercicio 1.5 n 5 k 3 Primo(n,k+1) Resultado n 5 k 2 Primo(n,k+1) Resultado EsPrimo(5) n 5 Primo(n,2) Resultado n 5 k 4 Primo(n,k+1) Resultado
Ejercicio 1.5 n 5 k 4 Primo(n,k+1) Resultado n 5 k 5 Primo(n,k+1) Resultado
Ejercicio 1.5 n 5 k 4 Primo(n,k+1) cierto Resultado n 5 k 5 Primo(n,k+1) Resultado
Ejercicio 1.5 n 5 k 3 Primo(n,k+1) cierto Resultado n 5 k 2 Primo(n,k+1) Resultado EsPrimo(5) n 5 Primo(n,2) Resultado n 5 k 4 Primo(n,k+1) cierto Resultado
Ejercicio 1.5 n 5 k 2 Primo(n,k+1) cierto Resultado EsPrimo(5) n 5 Primo(n,2) Resultado n 5 k 3 Primo(n,k+1) cierto Resultado
Ejercicio 1.5 EsPrimo(5) n 5 Primo(n,2) cierto Resultado n 5 k 2 Primo(n,k+1) cierto Resultado
Ejercicio 1.5 EsPrimo(5) cierto n 5 Primo(n,2) cierto Resultado
Ejercicio 1.5 EsPrimo(5) cierto
Ejercicio: Fibonacci La serie Fibonacci empieza por … Tiene una definición recursiva: F(0) = 1 F(1) = 1 F(n) = F(n-2) + F(n-1), n > 1
Fibonacci funcion F(n:natural) devuelve natural si (n <= 1) entonces devuelve 1; sino devuelve F(n-2)+F(n-1); fsi ffuncion
Ejercicio: Fibonacci Usar la pila para interpretar el resultado de F(4)
Ejercicio: Fibonacci F(4)
Ejercicio: Fibonacci F(4) n 4 F(n-2) F(n-1) Resultado
Ejercicio: Fibonacci F(4) n 4 F(n-2) F(n-1) Resultado n 2 F(n-2) F(n-1) Resultado
Ejercicio: Fibonacci F(4) n 4 F(n-2) F(n-1) Resultado n 2 F(n-2) F(n-1) Resultado n 0 F(n-2) F(n-1) Resultado
Ejercicio: Fibonacci F(4) n 4 F(n-2) F(n-1) Resultado n 2 F(n-2) 1 F(n-1) Resultado n 0 F(n-2) F(n-1) Resultado
Ejercicio: Fibonacci F(4) n 4 F(n-2) F(n-1) Resultado n 2 F(n-2) 1 F(n-1) Resultado n 1 F(n-2) F(n-1) Resultado
Ejercicio: Fibonacci F(4) n 4 F(n-2) F(n-1) Resultado n 2 F(n-2) 1 F(n-1) 1 Resultado n 1 F(n-2) F(n-1) Resultado
Ejercicio: Fibonacci F(4) n 4 F(n-2) 2 F(n-1) Resultado n 2 F(n-2) 1 F(n-1) 1 Resultado
Ejercicio: Fibonacci F(4) n 4 F(n-2) 2 F(n-1) Resultado n 3 F(n-2) F(n-1) Resultado
Ejercicio: Fibonacci F(4) n 4 F(n-2) 2 F(n-1) Resultado n 3 F(n-2) F(n-1) Resultado n 1 F(n-2) F(n-1) Resultado
Ejercicio: Fibonacci F(4) n 4 F(n-2) 2 F(n-1) Resultado n 3 F(n-2) 1 F(n-1) Resultado n 1 F(n-2) F(n-1) Resultado
Ejercicio: Fibonacci F(4) n 4 F(n-2) 2 F(n-1) Resultado n 3 F(n-2) 1 F(n-1) Resultado n 2 F(n-2) F(n-1) Resultado
Ejercicio: Fibonacci F(4) n 4 F(n-2) 2 F(n-1) Resultado n 3 F(n-2) 1 F(n-1) Resultado n 2 F(n-2) F(n-1) Resultado n 0 F(n-2) F(n-1) Resultado
Ejercicio: Fibonacci F(4) n 4 F(n-2) 2 F(n-1) Resultado n 3 F(n-2) 1 F(n-1) Resultado n 2 F(n-2) 1 F(n-1) Resultado n 0 F(n-2) F(n-1) Resultado
Ejercicio: Fibonacci F(4) n 4 F(n-2) 2 F(n-1) Resultado n 3 F(n-2) 1 F(n-1) Resultado n 2 F(n-2) 1 F(n-1) Resultado n 1 F(n-2) F(n-1) Resultado
Ejercicio: Fibonacci F(4) n 4 F(n-2) 2 F(n-1) Resultado n 3 F(n-2) 1 F(n-1) Resultado n 2 F(n-2) 1 F(n-1) 1 Resultado n 1 F(n-2) F(n-1) Resultado
Ejercicio: Fibonacci F(4) n 4 F(n-2) 2 F(n-1) Resultado n 3 F(n-2) 1 F(n-1) 2 Resultado n 2 F(n-2) 1 F(n-1) 1 Resultado
Ejercicio: Fibonacci F(4) n 4 F(n-2) 2 F(n-1) 3 Resultado n 3 F(n-2) 1 F(n-1) 2 Resultado
Ejercicio: Fibonacci F(4) 5 n 4 F(n-2) 2 F(n-1) 3 Resultado
Ejercicio: Fibonacci F(4) 5
Tipos de recursividad RecursividadDirectaIndirecta Simple Múltiple F(x) G(x)F(x) G(x)F(x)
Recursividad indirecta Determinar si un número natural n es par –caso base: n = 0 es un número par –caso recursivo: n es par si n – 1 es impar Determinar si un número natural n es impar –caso base: n = 0 no es un número impar –caso recursivo: n es impar si n – 1 es par
Par e impar funcion Par(n:natural) devuelve booleano si (n = 0) entonces devuelve cierto; sino devuelve Impar(n – 1); fsi ffuncion funcion Impar(n:natural) devuelve booleano si (n = 0) entonces devuelve falso; sino devuelve Par(n – 1); fsi ffuncion
Tipos de recursividad RecursividadDirectaIndirecta Simple Factorial(n) Suma(V,i,n) Primo(n,k) Par(n) – Impar(n) Múltiple Fibonacci(n)
Transformación Todo algoritmo recursivo se puede transformar en un algoritmo iterativo (con bucles) Más difícil para recursividad múltiple y/o indirecto No obstante, para recursividad simple y directo hay una transformación general
Función recursiva funcion Recursiva(x:tipo) devuelve tipo si B(x) entonces devuelve S; sino devuelve F(x, Recursiva(T(x))); fsi ffuncion x: parámetrosT(x): llamada recursiva B(x): condiciónF(x,y): acción recursiva S: acción caso base
Función equivalente iterativa funcion Iterativa(x:tipo) devuelve tipo resultado S; mientras no(B(x)) hacer resultado F(x, resultado); x T(x); fmientras devuelve resultado; ffuncion
Ejemplo: Factorial funcion Factorial(n:natural) devuelve natural si (n = 0) entonces devuelve 1; sino devuelve n*Factorial(n-1); fsi ffuncion x: nT(x): n - 1 B(x): n = 0F(x,y): n*y S: 1
Función equivalente iterativa funcion Factorial(n:natural) devuelve natural resultado 1; mientras no(n = 0) hacer resultado n*resultado; n n - 1; fmientras devuelve resultado; ffuncion
Ejemplo: Primo funcion Primo(n,k:natural) devuelve booleano si (k >= n) entonces devuelve cierto; sino si (n mod k = 0) entonces devuelve falso; sino devuelve Primo(n,k+1); fsi ffuncion x: n, kT(x): n, k+1 B(x): k >= nF(x,y): si (n mod k = 0) falso S: cierto sino y
Función equivalente iterativa funcion Primo(n,k:natural) devuelve booleano resultado cierto; mientras no(k >= n) hacer si (n mod k = 0) entonces resultado falso; sino resultado resultado; n n; k k + 1; fmientras devuelve resultado; ffuncion