[C con Clase] Duda sobre Funciones recursivas

Pablo Alejandro Herrero pablusplus en gmail.com
Mar Feb 7 17:14:43 CET 2012


Hola que tal amigos.

Me empieza a salir humo por las orejas con el tema de las funciones
recursivas. He leído varios sitios en la web para ver si me aclaro, pero
hasta el momento os pongo lo que he entendido de esto, para ver si estoy en
lo cierto o no.
Hola, creo entender tu duda. Lo que ocurre en una función recursiva es que
esta se llama a sí misma con lo cual (como con cualquier llamada a función)
cada vez que se invoca la función quedan sus parámetros de ejecucución en
la pila (stack). Por este motivo una vez que ocurre la última llamada,
empieza el retorno (se "desapilan" las llamadas anteriores). por eso se
habla de niveles de recursión: es util para recorrer estructuras de datos
como árboles pero hay que evitar que se llame muchas veces para evitar un
desbordamiento de la pila: en gral la pila asignada a un programa tiene un
tamaño determinado pero hoy por hoy es muuuucho más flexible que en tiempos
de DOS.
    Te paso tu texto, pero modificado: seria la lectura de la ejecución
paso a paso para que veas el retorno de cada nivel de recursión.

function factorial(n){
   if(n==1)
      return 1
   else
      return n * factorial(n-1)  //acá se produce la recursión!!!
}

Bien, si tenemos como n = 5, ¿esto se leería así / es lo que pasaría? :
function factorial(5){
--------------------------------------- LLAMADA A FUNCION
-------------------------------------
   if(n==1)      //FALSE
      return 1
   else
      return n * factorial(n-1)  //PASA 4
}
----------------------------------- 1ER NIVEL DE RECURSION
---------------------------------
    function factorial(4){
       if(n==1)      //FALSE
          return 1
       else
          return n * factorial(n-1)  //PASA 3
    }
----------------------------------- 2DO NIVEL DE RECURSION
---------------------------------
        function factorial(3){
           if(n==1)      //FALSE
              return 1
           else
              return n * factorial(n-1)  //PASA 2
        }
----------------------------------- 3ER NIVEL DE RECURSION
---------------------------------
            function factorial(2){
               if(n==1)      //FALSE
                  return 1
               else
                  return n * factorial(n-1)  //PASA 1
            }
----------------------------------- 4TO NIVEL DE RECURSION
---------------------------------
                function factorial(1){
                   if(n==1)  //TRUE
                      return 1

----------------------- EMPIEZAN LOS RETORNOS!! --------------------------
----------------------------------- 4TO NIVEL DE RECURSION
---------------------------------
            function factorial(2){
                  ...
                  return n * 1  //RETORNA (2 * 1)
            }
----------------------------------- 3ER NIVEL DE RECURSION
---------------------------------
          function factorial(3){
                ...
                return n * 2  //RETORNA 3 * (2 * 1)
          }
----------------------------------- 2DO NIVEL DE RECURSION
---------------------------------
        function factorial(4){
              ...
              return n * 6  //RETORNA 4 * ( 3 * (2 * 1))
        }
----------------------------------- 1ER NIVEL DE RECURSION
---------------------------------
  function factorial(5){
        ...
        return n * 24   //RETORNA 5 *(4 * (3 * (2 * 1)))
  }
------------------------------- retorno llamada
----------------------------------------------------
120 = (5 * (4 * (3 * (2 * 1))))

Estudiate lel mecanismo de las llamadas a funcion y la pila. Eso te va a
completar el panorama. Espero te sirva!
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20120207/241ca98e/attachment.html>


Más información sobre la lista de distribución Cconclase