Descargar la presentación
La descarga está en progreso. Por favor, espere
Publicada porBajardo Cuadrado Modificado hace 9 años
1
Recurrencia Programación II 27-28 de enero de 2009
2
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
3
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
4
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
5
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
6
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
7
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
8
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
9
Ejemplo: Factorial Factorial(3)
10
Ejemplo: Factorial Factorial(3) n 3 Factorial(n-1) Resultado
11
Ejemplo: Factorial Factorial(3) n 3 Factorial(n-1) Resultado n 2 Factorial(n-1) Resultado
12
Ejemplo: Factorial n 1 Factorial(n-1) Resultado Factorial(3) n 3 Factorial(n-1) Resultado n 2 Factorial(n-1) Resultado
13
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
14
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
15
Ejemplo: Factorial n 1 Factorial(n-1) 1 Resultado Factorial(3) n 3 Factorial(n-1) Resultado n 2 Factorial(n-1) 1 Resultado
16
Ejemplo: Factorial Factorial(3) n 3 Factorial(n-1) 2 Resultado n 2 Factorial(n-1) 1 Resultado
17
Ejemplo: Factorial Factorial(3) 6 n 3 Factorial(n-1) 2 Resultado
18
Ejemplo: Factorial Factorial(3) 6
19
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)
20
Ejercicio 1.5 funcion EsPrimo(n:natural) devuelve booleano devuelve Primo(n,2); ffuncion
21
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
22
Ejercicio 1.5 EsPrimo(5)
23
Ejercicio 1.5 EsPrimo(5) n 5 Primo(n,2) Resultado
24
Ejercicio 1.5 EsPrimo(5) n 5 Primo(n,2) Resultado n 5 k 2 Primo(n,k+1) Resultado
25
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
26
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
27
Ejercicio 1.5 n 5 k 4 Primo(n,k+1) Resultado n 5 k 5 Primo(n,k+1) Resultado
28
Ejercicio 1.5 n 5 k 4 Primo(n,k+1) cierto Resultado n 5 k 5 Primo(n,k+1) Resultado
29
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
30
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
31
Ejercicio 1.5 EsPrimo(5) n 5 Primo(n,2) cierto Resultado n 5 k 2 Primo(n,k+1) cierto Resultado
32
Ejercicio 1.5 EsPrimo(5) cierto n 5 Primo(n,2) cierto Resultado
33
Ejercicio 1.5 EsPrimo(5) cierto
34
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
35
Fibonacci funcion F(n:natural) devuelve natural si (n <= 1) entonces devuelve 1; sino devuelve F(n-2)+F(n-1); fsi ffuncion
36
Ejercicio: Fibonacci Usar la pila para interpretar el resultado de F(4)
37
Ejercicio: Fibonacci F(4)
38
Ejercicio: Fibonacci F(4) n 4 F(n-2) F(n-1) Resultado
39
Ejercicio: Fibonacci F(4) n 4 F(n-2) F(n-1) Resultado n 2 F(n-2) F(n-1) Resultado
40
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
41
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
42
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
43
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
44
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
45
Ejercicio: Fibonacci F(4) n 4 F(n-2) 2 F(n-1) Resultado n 3 F(n-2) F(n-1) Resultado
46
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
47
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
48
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
49
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
50
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
51
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
52
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
53
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
54
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
55
Ejercicio: Fibonacci F(4) 5 n 4 F(n-2) 2 F(n-1) 3 Resultado
56
Ejercicio: Fibonacci F(4) 5
57
Tipos de recursividad RecursividadDirectaIndirecta Simple Múltiple F(x) G(x)F(x) G(x)F(x)
58
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
59
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
60
Tipos de recursividad RecursividadDirectaIndirecta Simple Factorial(n) Suma(V,i,n) Primo(n,k) Par(n) – Impar(n) Múltiple Fibonacci(n)
61
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
62
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
63
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
64
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
65
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
66
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
67
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
Presentaciones similares
© 2024 SlidePlayer.es Inc.
All rights reserved.