La descarga está en progreso. Por favor, espere

La descarga está en progreso. Por favor, espere

Recurrencia Programación II 27-28 de enero de 2009.

Presentaciones similares


Presentación del tema: "Recurrencia Programación II 27-28 de enero de 2009."— Transcripción de la presentación:

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


Descargar ppt "Recurrencia Programación II 27-28 de enero de 2009."

Presentaciones similares


Anuncios Google