recurrencia programación ii 27-28 de enero de 2009
TRANSCRIPT
Recurrencia
Programación II
27-28 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
ffuncion caso 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
1 1 2 3 5 8 13 21 34 55 …
• 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
Recursividad Directa Indirecta
Simple
Múltiple
F(x)
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 booleanosi (n = 0) entonces
devuelve cierto;sino devuelve Impar(n – 1); fsi ffuncion
funcion Impar(n:natural) devuelve booleanosi (n = 0) entonces
devuelve falso;sino devuelve Par(n – 1); fsi ffuncion
Tipos de recursividad
Recursividad Directa Indirecta
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ámetros T(x): llamada recursiva
B(x): condición F(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: n T(x): n - 1
B(x): n = 0 F(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 booleanosi (k >= n) entonces
devuelve cierto; sino si (n mod k = 0) entonces devuelve falso; sino devuelve Primo(n,k+1); fsiffuncion
x: n, k T(x): n, k+1B(x): k >= n F(x,y): si (n mod k = 0) falsoS: cierto sino y
Función equivalente iterativa
funcion Primo(n,k:natural) devuelve booleanoresultado cierto;mientras no(k >= n) hacer
si (n mod k = 0) entonces resultado falso; sino resultado resultado; n n; k k + 1;fmientrasdevuelve resultado;
ffuncion