SlideShare una empresa de Scribd logo
1 de 25
Descargar para leer sin conexión
3.1 Recursión

  Apoyo SSD5
Funciones Recursivas
Una función recursiva es una función que
se llama a sí misma.
El uso de funciones recursivas, llamado
recursión, puede brindar soluciones
refinadas a problemas complejos.




                Mtl Lourdes Cahuich        2
Precaución con la recursividad
Un programador debe definir
cuidadosamente funciones recursivas,
para evitar crear una función que
repetidamente se llame a sí misma por
siempre.




                Mtl Lourdes Cahuich     3
Cómo encontrar la recursividad
Una clave para crear y usar funciones
recursivas eficientes, es aprender a
pensar en un problema en términos de un
problema similar, pero más pequeño.




                Mtl Lourdes Cahuich       4
Mtl Lourdes Cahuich   5
Caso base
Eventualmente, un problema se hace lo
suficientemente pequeño que una función
puede solucionarlo sin usar recursión.
Esto es llamado caso base o quot;base casequot;.




                Mtl Lourdes Cahuich        6
Ejemplo de recursión
El cálculo de factoriales es un ejemplo de
un problema que podemos resolver
usando recursión.
El factorial de un número es el producto
de todos los números enteros de ese
número hasta el uno.



                 Mtl Lourdes Cahuich         7
Ejemplo de recursión
Un signo de admiración denota el factorial
de un número.
Podemos expresar quot;cinco factorialquot; como
5!.




                 Mtl Lourdes Cahuich         8
Factorial
5!   =   5   *   4   *   3      *       2 * 1 = 120
4!   =   4   *   3   *   2      *       1 = 24
3!   =   3   *   2   *   1      =       6
2!   =   2   *   1   =   2
1!   =   1
0!   =   1


                             Mtl Lourdes Cahuich      9
Factorial
Podemos expresar los factoriales
recursivamente, es decir, en términos de
otros factoriales
5!   =   5   *   4!
4!   =   4   *   3!
3!   =   3   *   2!
2!   =   2   *   1!
1!   =   1   *   0!
0!   =   1

                        Mtl Lourdes Cahuich   10
#include <iostream>
#include <cstdlib>
#include <string>
using namespace std;
int factorial(int n) {
   if (n == 0) {
      // base case
       return 1;
   }
   else {
       // recursive call
      int value = factorial(n - 1);
       return n * value;
   }
}
int main(int argc, char* argv[]) {
   cout << factorial(5) << endl;
   return EXIT_SUCCESS;
}
                                  Mtl Lourdes Cahuich   11
La Pila de Llamadas (Call Stack)
La pila de llamadas es un área en la
memoria del programa usada para
administrar la función ejecutada
actualmente y todas las llamadas
pendientes a la función.
La siguiente figura ofrece más detalles de
lo quiere decir una quot;llamada pendiente a la
funciónquot;.

                 Mtl Lourdes Cahuich      12
Mtl Lourdes Cahuich   13
Pila de llamadas
En ella podemos ver que a pesar de que
la instancia de la función factorial con el
parámetro 5 fue la primera en comenzar la
ejecución, es la última en finalizarla.




                 Mtl Lourdes Cahuich      14
Pila de llamadas
El programa detiene la ejecución de
factorial(5)hasta que se complete la
llamada de la función a factorial(4).
De igual forma, el programa detiene la
ejecución de factorial(4) hasta que se
complete la llamada de la función a
factorial(3).


                 Mtl Lourdes Cahuich     15
Pila de llamadas
Esta serie de llamadas a las funciones
anidadas es administrada usando la pila
de llamadas




                Mtl Lourdes Cahuich       16
#include <iostream>
#include <cstdlib>
using namespace std;
void method3(void) {
   cout << quot;Method 3quot; << endl;
}
void method2(void) {
   method3();
}
void method1(void) {
   method2();
}
int main(int argc, char* argv[]) {
   method1();
   return EXIT_SUCCESS; Lourdes Cahuich
                           Mtl            17

}
Mtl Lourdes Cahuich   18
Pila de llamadas
La pila de llamadas opera de la misma
forma con funciones recursivas que con
funciones regulares
Las funciones anidadas continúan
quot;desenredándosequot; de esta forma,
regresando valores a sus funciones de
llamada, hasta que la función se completa
y el programa termina.

                Mtl Lourdes Cahuich     19
Depurador y recursividad
Los depuradores (debuggers) a menudo
tienen una característica que permite a los
programadores inspeccionar la pila de
llamadas de un programa.
Esta característica puede ser de gran
valor al tratar de depurar una función
recursiva.


                 Mtl Lourdes Cahuich      20
¿Cómo eliminar una recursión?
La recursión tiene un precio: el sistema de
ejecución tiene que mantener una
complicada pila de llamadas, además de
tener que desarrollar las evaluaciones
usuales contenidas en la función.
A menudo podemos eliminar la recursión
en favor de la iteración, la cual no
demanda lo mismo en el sistema de
ejecución.

                 Mtl Lourdes Cahuich      21
Eliminando recursión
Por ejemplo, el siguiente bucle basado en
funciones factoriales garantiza una
ejecución más rápida y que consume
menos memoria (en la pila de llamadas)
que la versión recursiva presentada
anteriormente.



                Mtl Lourdes Cahuich         22
int factorial(int n) {
    int x = 1;
    for (int i = 2; i <= n; ++i)
  {
        x *= i;
    }
    return x;
}

              Mtl Lourdes Cahuich   23
Consideraciones finales recursión
Siempre es posible eliminar la recursión, y
vale la pena pensar en reemplazar la
recursión con bucles.
En algunos casos, de cualquier forma, la
recursión puede ser el mejor método.




                 Mtl Lourdes Cahuich      24
Consideraciones finales recursión
Versiones no-recursivas de ciertos
algoritmos pueden ser mucho más
complicadas de programar, que la
eficiencia obtenida no vale el esfuerzo
adicional




                 Mtl Lourdes Cahuich      25

Más contenido relacionado

La actualidad más candente

Semana 3 Fundamentos de Python(Funciones y Métodos)
Semana 3   Fundamentos de Python(Funciones y Métodos)Semana 3   Fundamentos de Python(Funciones y Métodos)
Semana 3 Fundamentos de Python(Funciones y Métodos)Richard Eliseo Mendoza Gafaro
 
Funciones de Cadenas/ Computación para ingenieros
Funciones de Cadenas/ Computación para ingenierosFunciones de Cadenas/ Computación para ingenieros
Funciones de Cadenas/ Computación para ingenierosMaria jose Ramirez perez
 
Estructuras de control c++
Estructuras de control c++Estructuras de control c++
Estructuras de control c++Jesús Navarro
 
Matlab 2
Matlab 2Matlab 2
Matlab 2jmh700
 
04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...
04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...
04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...Diego Andrés Alvarez Marín
 
Estructura repetitiva for
Estructura repetitiva forEstructura repetitiva for
Estructura repetitiva forDenisse C
 
Clase 02 gestion de puertos - directivas
Clase 02   gestion de puertos - directivasClase 02   gestion de puertos - directivas
Clase 02 gestion de puertos - directivasalmidon_pcb
 
Punteros a Funciones en C
Punteros a Funciones en CPunteros a Funciones en C
Punteros a Funciones en CAnesGy SD
 
Clase 2 Estructuras de Control
Clase 2 Estructuras de ControlClase 2 Estructuras de Control
Clase 2 Estructuras de ControlDesireé mart?ez
 
Presentación 13 Paso por referencia
Presentación 13 Paso por referenciaPresentación 13 Paso por referencia
Presentación 13 Paso por referenciaAndres Bedoya Tobon
 
Instrucciones de control repetitivas
Instrucciones de control repetitivasInstrucciones de control repetitivas
Instrucciones de control repetitivasAbrirllave
 
Fpr0407 control
Fpr0407 controlFpr0407 control
Fpr0407 controllabebelo
 
Instrucciones de control repetitivas
Instrucciones de control repetitivasInstrucciones de control repetitivas
Instrucciones de control repetitivasCarlos Pes
 
Estructura repetitiva do while
Estructura repetitiva do whileEstructura repetitiva do while
Estructura repetitiva do whileDenisse C
 
Control de flujo bucles
Control de flujo buclesControl de flujo bucles
Control de flujo buclesOmar Grano
 
Estructuras de decisión o selectivas
Estructuras de decisión o selectivasEstructuras de decisión o selectivas
Estructuras de decisión o selectivasDenisse C
 

La actualidad más candente (20)

Semana 3 Fundamentos de Python(Funciones y Métodos)
Semana 3   Fundamentos de Python(Funciones y Métodos)Semana 3   Fundamentos de Python(Funciones y Métodos)
Semana 3 Fundamentos de Python(Funciones y Métodos)
 
Funciones de Cadenas/ Computación para ingenieros
Funciones de Cadenas/ Computación para ingenierosFunciones de Cadenas/ Computación para ingenieros
Funciones de Cadenas/ Computación para ingenieros
 
Estructuras de control c++
Estructuras de control c++Estructuras de control c++
Estructuras de control c++
 
Matlab 2
Matlab 2Matlab 2
Matlab 2
 
04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...
04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...
04 - Sentencias de control condicionales y ciclos en lenguaje C: for, while, ...
 
Estructura repetitiva for
Estructura repetitiva forEstructura repetitiva for
Estructura repetitiva for
 
Clase 02 gestion de puertos - directivas
Clase 02   gestion de puertos - directivasClase 02   gestion de puertos - directivas
Clase 02 gestion de puertos - directivas
 
Punteros a Funciones en C
Punteros a Funciones en CPunteros a Funciones en C
Punteros a Funciones en C
 
Presentación 09 Cajas blanca
Presentación 09 Cajas blancaPresentación 09 Cajas blanca
Presentación 09 Cajas blanca
 
Clase 2 Estructuras de Control
Clase 2 Estructuras de ControlClase 2 Estructuras de Control
Clase 2 Estructuras de Control
 
Manual.es
Manual.esManual.es
Manual.es
 
Sentencias de control
Sentencias de controlSentencias de control
Sentencias de control
 
Presentación 13 Paso por referencia
Presentación 13 Paso por referenciaPresentación 13 Paso por referencia
Presentación 13 Paso por referencia
 
Instrucciones de control repetitivas
Instrucciones de control repetitivasInstrucciones de control repetitivas
Instrucciones de control repetitivas
 
Fpr0407 control
Fpr0407 controlFpr0407 control
Fpr0407 control
 
Instrucciones de control repetitivas
Instrucciones de control repetitivasInstrucciones de control repetitivas
Instrucciones de control repetitivas
 
Estructura repetitiva do while
Estructura repetitiva do whileEstructura repetitiva do while
Estructura repetitiva do while
 
Control de flujo bucles
Control de flujo buclesControl de flujo bucles
Control de flujo bucles
 
Palindromos
PalindromosPalindromos
Palindromos
 
Estructuras de decisión o selectivas
Estructuras de decisión o selectivasEstructuras de decisión o selectivas
Estructuras de decisión o selectivas
 

Similar a 11 Recursion

Recursividad en programación
Recursividad en programaciónRecursividad en programación
Recursividad en programaciónKareliaRivas
 
recursividad EN PROGRAMACION ORIENTADA .pptx
recursividad EN PROGRAMACION ORIENTADA .pptxrecursividad EN PROGRAMACION ORIENTADA .pptx
recursividad EN PROGRAMACION ORIENTADA .pptxjuan gonzalez
 
PBD_EST_DO_WHILE_1ROS.pdf
PBD_EST_DO_WHILE_1ROS.pdfPBD_EST_DO_WHILE_1ROS.pdf
PBD_EST_DO_WHILE_1ROS.pdfJessenia Realpe
 
Recursividad2019
Recursividad2019Recursividad2019
Recursividad2019difersld
 
RECURSIVIDAD C++
RECURSIVIDAD C++RECURSIVIDAD C++
RECURSIVIDAD C++Ing SC B
 
Introducción a la Programación en Javascript. Clase 1
Introducción a la Programación en Javascript. Clase 1Introducción a la Programación en Javascript. Clase 1
Introducción a la Programación en Javascript. Clase 1xjordi
 
Estructuras de iteracion
Estructuras de iteracionEstructuras de iteracion
Estructuras de iteracionUVM
 
Tutorial lenguaje c
Tutorial lenguaje cTutorial lenguaje c
Tutorial lenguaje ctbjs
 
Tutorial lenguaje c
Tutorial lenguaje cTutorial lenguaje c
Tutorial lenguaje ctbjs
 
Benemérita universidad autónoma de puebla
Benemérita universidad autónoma de pueblaBenemérita universidad autónoma de puebla
Benemérita universidad autónoma de pueblaErick Martinez
 
Informe Técnico - Recursividad Unidad 2 (Rubi Veronica)
Informe Técnico - Recursividad Unidad 2 (Rubi Veronica)Informe Técnico - Recursividad Unidad 2 (Rubi Veronica)
Informe Técnico - Recursividad Unidad 2 (Rubi Veronica)Rubi Veronica Chimal Cuxin
 
ESTRUCTURAS DE CONTROL: BUCLES EN C++
ESTRUCTURAS DE CONTROL: BUCLES EN C++ESTRUCTURAS DE CONTROL: BUCLES EN C++
ESTRUCTURAS DE CONTROL: BUCLES EN C++die_dex
 

Similar a 11 Recursion (20)

03 tda1 t2018
03 tda1 t201803 tda1 t2018
03 tda1 t2018
 
Recursividad en programación
Recursividad en programaciónRecursividad en programación
Recursividad en programación
 
recursividad.pptx
recursividad.pptxrecursividad.pptx
recursividad.pptx
 
recursividad EN PROGRAMACION ORIENTADA .pptx
recursividad EN PROGRAMACION ORIENTADA .pptxrecursividad EN PROGRAMACION ORIENTADA .pptx
recursividad EN PROGRAMACION ORIENTADA .pptx
 
PBD_EST_DO_WHILE_1ROS.pdf
PBD_EST_DO_WHILE_1ROS.pdfPBD_EST_DO_WHILE_1ROS.pdf
PBD_EST_DO_WHILE_1ROS.pdf
 
Estructuras de Control Repetitivo
Estructuras de Control RepetitivoEstructuras de Control Repetitivo
Estructuras de Control Repetitivo
 
Funciones recursivas en C++
Funciones recursivas en C++Funciones recursivas en C++
Funciones recursivas en C++
 
Recursividad2019
Recursividad2019Recursividad2019
Recursividad2019
 
RECURSIVIDAD C++
RECURSIVIDAD C++RECURSIVIDAD C++
RECURSIVIDAD C++
 
021 056
021 056021 056
021 056
 
Introducción a la Programación en Javascript. Clase 1
Introducción a la Programación en Javascript. Clase 1Introducción a la Programación en Javascript. Clase 1
Introducción a la Programación en Javascript. Clase 1
 
Práctica N°3.pdf
Práctica N°3.pdfPráctica N°3.pdf
Práctica N°3.pdf
 
Estructuras de iteracion
Estructuras de iteracionEstructuras de iteracion
Estructuras de iteracion
 
Algoritmo utilizando pseudolenguaje
Algoritmo utilizando pseudolenguajeAlgoritmo utilizando pseudolenguaje
Algoritmo utilizando pseudolenguaje
 
Tutorial lenguaje c
Tutorial lenguaje cTutorial lenguaje c
Tutorial lenguaje c
 
Tutorial lenguaje c
Tutorial lenguaje cTutorial lenguaje c
Tutorial lenguaje c
 
Benemérita universidad autónoma de puebla
Benemérita universidad autónoma de pueblaBenemérita universidad autónoma de puebla
Benemérita universidad autónoma de puebla
 
6.funciones y recursividad en c++
6.funciones y recursividad en c++6.funciones y recursividad en c++
6.funciones y recursividad en c++
 
Informe Técnico - Recursividad Unidad 2 (Rubi Veronica)
Informe Técnico - Recursividad Unidad 2 (Rubi Veronica)Informe Técnico - Recursividad Unidad 2 (Rubi Veronica)
Informe Técnico - Recursividad Unidad 2 (Rubi Veronica)
 
ESTRUCTURAS DE CONTROL: BUCLES EN C++
ESTRUCTURAS DE CONTROL: BUCLES EN C++ESTRUCTURAS DE CONTROL: BUCLES EN C++
ESTRUCTURAS DE CONTROL: BUCLES EN C++
 

Más de UVM

Tiempo compartido en programación
Tiempo compartido en programaciónTiempo compartido en programación
Tiempo compartido en programaciónUVM
 
Portafolio de evidencias del curso Programación Avanzada
Portafolio de evidencias del curso Programación AvanzadaPortafolio de evidencias del curso Programación Avanzada
Portafolio de evidencias del curso Programación AvanzadaUVM
 
Eficiencia en uso tiempo
Eficiencia en uso  tiempoEficiencia en uso  tiempo
Eficiencia en uso tiempoUVM
 
Administración de memoria arreglos dinamicos
Administración de memoria arreglos dinamicosAdministración de memoria arreglos dinamicos
Administración de memoria arreglos dinamicosUVM
 
Practica de arreglos
Practica de arreglosPractica de arreglos
Practica de arreglosUVM
 
Otra introducción a apuntadores
Otra introducción a apuntadoresOtra introducción a apuntadores
Otra introducción a apuntadoresUVM
 
Ejemplo de solución de práctica funciones stl
Ejemplo de solución de práctica funciones stlEjemplo de solución de práctica funciones stl
Ejemplo de solución de práctica funciones stlUVM
 
Breve repaso de apuntadores
Breve repaso de apuntadoresBreve repaso de apuntadores
Breve repaso de apuntadoresUVM
 
Arreglos conceptos básicos
Arreglos conceptos básicosArreglos conceptos básicos
Arreglos conceptos básicosUVM
 
Resolución práctica de tipos de datos
Resolución práctica de tipos de datosResolución práctica de tipos de datos
Resolución práctica de tipos de datosUVM
 
Resumen de funciones
Resumen de funcionesResumen de funciones
Resumen de funcionesUVM
 
Biblioteca estándar de funciones
Biblioteca estándar de funcionesBiblioteca estándar de funciones
Biblioteca estándar de funcionesUVM
 
Manejo de bits
Manejo de bitsManejo de bits
Manejo de bitsUVM
 
Aclaración de dudas 4 de septiembre
Aclaración de dudas 4 de septiembreAclaración de dudas 4 de septiembre
Aclaración de dudas 4 de septiembreUVM
 
Aclaraciones varias a códigos entregados en sesión 3
Aclaraciones varias a códigos entregados en sesión 3Aclaraciones varias a códigos entregados en sesión 3
Aclaraciones varias a códigos entregados en sesión 3UVM
 
Funciones definidas por el usuario
Funciones definidas por el usuarioFunciones definidas por el usuario
Funciones definidas por el usuarioUVM
 
Función main()
Función main()Función main()
Función main()UVM
 
Depuración de un programa en c++
Depuración de un programa en c++Depuración de un programa en c++
Depuración de un programa en c++UVM
 
Algunas dudas de la sesión 28 agosto
Algunas dudas de la sesión 28 agostoAlgunas dudas de la sesión 28 agosto
Algunas dudas de la sesión 28 agostoUVM
 
Estructura programa c++
Estructura programa c++Estructura programa c++
Estructura programa c++UVM
 

Más de UVM (20)

Tiempo compartido en programación
Tiempo compartido en programaciónTiempo compartido en programación
Tiempo compartido en programación
 
Portafolio de evidencias del curso Programación Avanzada
Portafolio de evidencias del curso Programación AvanzadaPortafolio de evidencias del curso Programación Avanzada
Portafolio de evidencias del curso Programación Avanzada
 
Eficiencia en uso tiempo
Eficiencia en uso  tiempoEficiencia en uso  tiempo
Eficiencia en uso tiempo
 
Administración de memoria arreglos dinamicos
Administración de memoria arreglos dinamicosAdministración de memoria arreglos dinamicos
Administración de memoria arreglos dinamicos
 
Practica de arreglos
Practica de arreglosPractica de arreglos
Practica de arreglos
 
Otra introducción a apuntadores
Otra introducción a apuntadoresOtra introducción a apuntadores
Otra introducción a apuntadores
 
Ejemplo de solución de práctica funciones stl
Ejemplo de solución de práctica funciones stlEjemplo de solución de práctica funciones stl
Ejemplo de solución de práctica funciones stl
 
Breve repaso de apuntadores
Breve repaso de apuntadoresBreve repaso de apuntadores
Breve repaso de apuntadores
 
Arreglos conceptos básicos
Arreglos conceptos básicosArreglos conceptos básicos
Arreglos conceptos básicos
 
Resolución práctica de tipos de datos
Resolución práctica de tipos de datosResolución práctica de tipos de datos
Resolución práctica de tipos de datos
 
Resumen de funciones
Resumen de funcionesResumen de funciones
Resumen de funciones
 
Biblioteca estándar de funciones
Biblioteca estándar de funcionesBiblioteca estándar de funciones
Biblioteca estándar de funciones
 
Manejo de bits
Manejo de bitsManejo de bits
Manejo de bits
 
Aclaración de dudas 4 de septiembre
Aclaración de dudas 4 de septiembreAclaración de dudas 4 de septiembre
Aclaración de dudas 4 de septiembre
 
Aclaraciones varias a códigos entregados en sesión 3
Aclaraciones varias a códigos entregados en sesión 3Aclaraciones varias a códigos entregados en sesión 3
Aclaraciones varias a códigos entregados en sesión 3
 
Funciones definidas por el usuario
Funciones definidas por el usuarioFunciones definidas por el usuario
Funciones definidas por el usuario
 
Función main()
Función main()Función main()
Función main()
 
Depuración de un programa en c++
Depuración de un programa en c++Depuración de un programa en c++
Depuración de un programa en c++
 
Algunas dudas de la sesión 28 agosto
Algunas dudas de la sesión 28 agostoAlgunas dudas de la sesión 28 agosto
Algunas dudas de la sesión 28 agosto
 
Estructura programa c++
Estructura programa c++Estructura programa c++
Estructura programa c++
 

11 Recursion

  • 1. 3.1 Recursión Apoyo SSD5
  • 2. Funciones Recursivas Una función recursiva es una función que se llama a sí misma. El uso de funciones recursivas, llamado recursión, puede brindar soluciones refinadas a problemas complejos. Mtl Lourdes Cahuich 2
  • 3. Precaución con la recursividad Un programador debe definir cuidadosamente funciones recursivas, para evitar crear una función que repetidamente se llame a sí misma por siempre. Mtl Lourdes Cahuich 3
  • 4. Cómo encontrar la recursividad Una clave para crear y usar funciones recursivas eficientes, es aprender a pensar en un problema en términos de un problema similar, pero más pequeño. Mtl Lourdes Cahuich 4
  • 6. Caso base Eventualmente, un problema se hace lo suficientemente pequeño que una función puede solucionarlo sin usar recursión. Esto es llamado caso base o quot;base casequot;. Mtl Lourdes Cahuich 6
  • 7. Ejemplo de recursión El cálculo de factoriales es un ejemplo de un problema que podemos resolver usando recursión. El factorial de un número es el producto de todos los números enteros de ese número hasta el uno. Mtl Lourdes Cahuich 7
  • 8. Ejemplo de recursión Un signo de admiración denota el factorial de un número. Podemos expresar quot;cinco factorialquot; como 5!. Mtl Lourdes Cahuich 8
  • 9. Factorial 5! = 5 * 4 * 3 * 2 * 1 = 120 4! = 4 * 3 * 2 * 1 = 24 3! = 3 * 2 * 1 = 6 2! = 2 * 1 = 2 1! = 1 0! = 1 Mtl Lourdes Cahuich 9
  • 10. Factorial Podemos expresar los factoriales recursivamente, es decir, en términos de otros factoriales 5! = 5 * 4! 4! = 4 * 3! 3! = 3 * 2! 2! = 2 * 1! 1! = 1 * 0! 0! = 1 Mtl Lourdes Cahuich 10
  • 11. #include <iostream> #include <cstdlib> #include <string> using namespace std; int factorial(int n) { if (n == 0) { // base case return 1; } else { // recursive call int value = factorial(n - 1); return n * value; } } int main(int argc, char* argv[]) { cout << factorial(5) << endl; return EXIT_SUCCESS; } Mtl Lourdes Cahuich 11
  • 12. La Pila de Llamadas (Call Stack) La pila de llamadas es un área en la memoria del programa usada para administrar la función ejecutada actualmente y todas las llamadas pendientes a la función. La siguiente figura ofrece más detalles de lo quiere decir una quot;llamada pendiente a la funciónquot;. Mtl Lourdes Cahuich 12
  • 14. Pila de llamadas En ella podemos ver que a pesar de que la instancia de la función factorial con el parámetro 5 fue la primera en comenzar la ejecución, es la última en finalizarla. Mtl Lourdes Cahuich 14
  • 15. Pila de llamadas El programa detiene la ejecución de factorial(5)hasta que se complete la llamada de la función a factorial(4). De igual forma, el programa detiene la ejecución de factorial(4) hasta que se complete la llamada de la función a factorial(3). Mtl Lourdes Cahuich 15
  • 16. Pila de llamadas Esta serie de llamadas a las funciones anidadas es administrada usando la pila de llamadas Mtl Lourdes Cahuich 16
  • 17. #include <iostream> #include <cstdlib> using namespace std; void method3(void) { cout << quot;Method 3quot; << endl; } void method2(void) { method3(); } void method1(void) { method2(); } int main(int argc, char* argv[]) { method1(); return EXIT_SUCCESS; Lourdes Cahuich Mtl 17 }
  • 19. Pila de llamadas La pila de llamadas opera de la misma forma con funciones recursivas que con funciones regulares Las funciones anidadas continúan quot;desenredándosequot; de esta forma, regresando valores a sus funciones de llamada, hasta que la función se completa y el programa termina. Mtl Lourdes Cahuich 19
  • 20. Depurador y recursividad Los depuradores (debuggers) a menudo tienen una característica que permite a los programadores inspeccionar la pila de llamadas de un programa. Esta característica puede ser de gran valor al tratar de depurar una función recursiva. Mtl Lourdes Cahuich 20
  • 21. ¿Cómo eliminar una recursión? La recursión tiene un precio: el sistema de ejecución tiene que mantener una complicada pila de llamadas, además de tener que desarrollar las evaluaciones usuales contenidas en la función. A menudo podemos eliminar la recursión en favor de la iteración, la cual no demanda lo mismo en el sistema de ejecución. Mtl Lourdes Cahuich 21
  • 22. Eliminando recursión Por ejemplo, el siguiente bucle basado en funciones factoriales garantiza una ejecución más rápida y que consume menos memoria (en la pila de llamadas) que la versión recursiva presentada anteriormente. Mtl Lourdes Cahuich 22
  • 23. int factorial(int n) { int x = 1; for (int i = 2; i <= n; ++i) { x *= i; } return x; } Mtl Lourdes Cahuich 23
  • 24. Consideraciones finales recursión Siempre es posible eliminar la recursión, y vale la pena pensar en reemplazar la recursión con bucles. En algunos casos, de cualquier forma, la recursión puede ser el mejor método. Mtl Lourdes Cahuich 24
  • 25. Consideraciones finales recursión Versiones no-recursivas de ciertos algoritmos pueden ser mucho más complicadas de programar, que la eficiencia obtenida no vale el esfuerzo adicional Mtl Lourdes Cahuich 25