Descargar

Introducción a la recursión (página 2)

Enviado por Pablo Turmero


Partes: 1, 2, 3
edu.red Title: La pila del sistema (stack) Other Placeholder: Regiones de memoria que distingue el sistema operativo:

(Gp:) Llamadas a subprogramas

(Gp:) Memoria dinámica (Tema 9)

(Gp:) Memoria principal

edu.red Title: La pila del sistema (stack) Other Placeholder: Mantiene los datos locales de la función y la dirección de vuelta Estructura de tipo pila: lista LIFO (last-in first-out) El último que entra es el primero que sale:

Entra4 Entra7 Entra 2 Sale 2

edu.red Title: La pila y las llamadas a función Other Placeholder: Datos locales y direcciones de vuelta … int funcB(int x) { … return x; } int funcA(int a) { int b; … b = funcB(a); … return b; } int main() { … cout << funcA(4); … Pila

(Gp:) Llamada a función: Entra la dirección de vuelta

edu.red Other Placeholder: Datos locales y direcciones de vuelta … int funcB(int x) { … return x; } int funcA(int a) { int b; … b = funcB(a); … return b; } int main() { … cout << funcA(4); … Title: La pila y las llamadas a función Pila

(Gp:) Entrada en la función: Se alojan los datos locales

edu.red Other Placeholder: Datos locales y direcciones de vuelta … int funcB(int x) { … return x; } int funcA(int a) { int b; … b = funcB(a); … return b; } int main() { … cout << funcA(4); … Title: La pila y las llamadas a función Pila

(Gp:) Llamada a función: Entra la dirección de vuelta

edu.red Other Placeholder: Datos locales y direcciones de vuelta … int funcB(int x) { … return x; } int funcA(int a) { int b; … b = funcB(a); … return b; } int main() { … cout << funcA(4); … Title: La pila y las llamadas a función Pila

(Gp:) Entrada en la función: Se alojan los datos locales

edu.red Other Placeholder: Datos locales y direcciones de vuelta … int funcB(int x) { … return x; } int funcA(int a) { int b; … b = funcB(a); … return b; } int main() { … cout << funcA(4); … Title: La pila y las llamadas a función Pila

(Gp:) Vuelta de la función: Se eliminan los datos locales

edu.red Other Placeholder: Datos locales y direcciones de vuelta … int funcB(int x) { … return x; } int funcA(int a) { int b; … b = funcB(a); … return b; } int main() { … cout << funcA(4); … Title: La pila y las llamadas a función Pila

(Gp:) Vuelta de la función: Sale la dirección de vuelta

edu.red Other Placeholder: Datos locales y direcciones de vuelta … int funcB(int x) { … return x; } int funcA(int a) { int b; … b = funcB(a); … return b; } int main() { … cout << funcA(4); … Title: La pila y las llamadas a función Pila

(Gp:) La ejecución continúaen esa dirección

edu.red Other Placeholder: Datos locales y direcciones de vuelta … int funcB(int x) { … return x; } int funcA(int a) { int b; … b = funcB(a); … return b; } int main() { … cout << funcA(4); … Title: La pila y las llamadas a función Pila

(Gp:) Vuelta de la función: Se eliminan los datos locales

edu.red Other Placeholder: Datos locales y direcciones de vuelta … int funcB(int x) { … return x; } int funcA(int a) { int b; … b = funcB(a); … return b; } int main() { … cout << funcA(4); … Title: La pila y las llamadas a función Pila

(Gp:) Vuelta de la función: Sale la dirección de vuelta

edu.red Other Placeholder: Datos locales y direcciones de vuelta … int funcB(int x) { … return x; } int funcA(int a) { int b; … b = funcB(a); … return b; } int main() { … cout << funcA(4); … Title: La pila y las llamadas a función Pila

(Gp:) La ejecución continúaen esa dirección

edu.red Title: La pila y las llamadas a función Other Placeholder: Mecanismo de pila adecuado para llamadas a funciones anidadas: Las llamadas terminan en el orden contrario a como se llaman … int funcC(…) { … } int funcB(…) { … … funcC(…) } int funcA(…) { … … funcB(…) } int main() { … cout << funcA(…); …

Pila LLAMADAS VUELTAS

edu.red Title: Ejecución de la función factorial() Other Placeholder: long long int factorial(int n) { long long int resultado; if (n == 0) { // Caso base resultado = 1; } else { resultado = n * factorial(n – 1); } return resultado; }

cout << factorial(5) << endl;

(Gp:) Obviaremos las direcciones de vuelta en la pila

edu.red Title: Ejecución de la función factorial() Other Placeholder: factorial(5)

Pila

edu.red Title: Ejecución de la función factorial() Other Placeholder: factorial(5) factorial(4) Pila

edu.red Title: Ejecución de la función factorial() Other Placeholder: factorial(5) factorial(4) factorial(3)

Pila

edu.red Title: Ejecución de la función factorial() Other Placeholder: factorial(5) factorial(4) factorial(3) factorial(2) Pila

edu.red Title: Ejecución de la función factorial() Other Placeholder: factorial(5) factorial(4) factorial(3) factorial(2) factorial(1) Pila

edu.red Title: Ejecución de la función factorial() Other Placeholder: factorial(5) factorial(4) factorial(3) factorial(2) factorial(1) factorial(0)

Pila

edu.red Title: Ejecución de la función factorial() Other Placeholder: factorial(5) factorial(4) factorial(3) factorial(2) factorial(1) factorial(0)

Pila 1

edu.red Title: Ejecución de la función factorial() Other Placeholder: factorial(5) factorial(4) factorial(3) factorial(2) factorial(1) factorial(0)

Pila 1 1

edu.red Title: Ejecución de la función factorial() Other Placeholder: factorial(5) factorial(4) factorial(3) factorial(2) factorial(1) factorial(0)

Pila 1 1 2

edu.red Title: Ejecución de la función factorial() Other Placeholder: factorial(5) factorial(4) factorial(3) factorial(2) factorial(1) factorial(0)

Pila 1 1 2 6

edu.red Title: Ejecución de la función factorial() Other Placeholder: factorial(5) factorial(4) factorial(3) factorial(2) factorial(1) factorial(0)

Pila 1 1 2 6 24

edu.red Title: Ejecución de la función factorial() Other Placeholder: factorial(5) factorial(4) factorial(3) factorial(2) factorial(1) factorial(0)

Pila 120 1 1 2 6 24

edu.red Title: Fundamentos de la programación Tipos de recursión

edu.red Title: Recursión simple Other Placeholder: Sólo hay una llamada recursiva Ejemplo: Cálculo del factorial de un número entero positivo long long int factorial(int n) { long long int resultado; if (n == 0) { // Caso base resultado = 1; } else { resultado = n * factorial(n – 1); } return resultado; }

(Gp:) Una sola llamada recursiva

edu.red Title: Recursión múltiple Other Placeholder: Varias llamadas recursivas Ejemplo: Cálculo de los números de Fibonacci

1 si n = 1 Fib(n) 0 si n = 0 Fib(n-1) + Fib(n-2) si n > 1 (Gp:) Dos llamadas recursivas

edu.red Title: Recursión múltiple Other Placeholder: … int main() { for (int i = 0; i < 20; i++) { cout << fibonacci(i) << endl; } return 0; }

int fibonacci(int n) { int resultado; if (n == 0) { resultado = 0; } else if (n == 1) { resultado = 1; } else { resultado = fibonacci(n – 1) + fibonacci(n – 2); } return resultado; } 1 si n = 1 Fib(n) 0 si n = 0 Fib(n-1) + Fib(n-2) si n > 1 fibonacci.cpp

Partes: 1, 2, 3
 Página anterior Volver al principio del trabajoPágina siguiente