Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: axeelcs en 20 Agosto 2011, 19:46 pm



Título: Problema de entendimiento recursividad.
Publicado por: axeelcs en 20 Agosto 2011, 19:46 pm
Tengo este ejercicio .
Planteamiento Ejercicio 5: Programar un algoritmo recursivo que permita sumar los dígitos de un número.Ejemplo: Entrada:123 Resultado:6

Y el código es así :

int sumar(int n)
{
if (n == 0) {
return n;
}

else {
return sumar(n/10) + (n%10);
}
}


Pero no lo entiendo, no logro entender .

alguién me lo podría explicar por favor ?
ej=126.
me refiero, a que lo primero que hace es (126/10)+(126%10) = 12 + 6 .
y ahora lo vuelvo a hacer ? , hasta qe n== 0.. pero cual de los dos vuelve a hacer .
agradecería si me aclaran el tema.
saludos .


Título: Re: Problema de entendimiento recursividad.
Publicado por: BlackZeroX en 20 Agosto 2011, 19:58 pm
.
Código
  1. #include <stdio.h>
  2.  
  3. int sumar(int n) {
  4.    if (!n)
  5.        return n;
  6.    return sumar(n / 10) + (n % 10);
  7. }
  8. int main()
  9. {
  10.    printf("%d\n", sumar(126));
  11.    getchar();
  12.    return 0;
  13. }
  14.  
  15.  

n = 126
sumar(n/10) + (n % 10) --> recursivamente....hasta n = 0... es decir:

-->sumar( 126 ) //llamada...

//Se aplica la teoria de la pila (el ultimo el el primero en salir) asi que...
0   <-- segun el algoritmo anterior ya no se ejecuta sumar.
sumar( 0 ) + 1
sumar( 1 ) + 2
sumar( 12 ) + 6
//Se leen las llamadas de abajo hacia arriba... donde el de arriba {0} es el caso de termino.

Por lo tanto:

((((0) + 1) + 2) + 6) = 9

Dulces Lunas!¡.


Título: Re: Problema de entendimiento recursividad.
Publicado por: Darkgold9 en 20 Agosto 2011, 20:07 pm
La recursividad se basa en llamar a una funcion "recursivamente", es decir llamar a una funcion asi misma hasta llegar a lo que se suele llamar caso Base, que en tu caso seria la parte:

Código:
if (n == 0) {
return n;
}

Una vez aqui la funcion "deja de llamarse asi misma" o "llega a la base", y vuelve hacia atras reconstruyendo el algoritmo con los valores que te han puesto en el post de arriba:

Citar
sumar( 126 )
//Se aplica la teoria de la pila (el ultimo el el primero en salir) asi que...
1
sumar( 1 ) + 2
sumar( 12 ) + 6

Basicamente la recursividad se resume en dos puntos:

1- Caso base. (Entiendelo como el caso en el que para y deja de llamarse asi mismo, dicho en plan chapuza  :xD)
2- Caso recursivo. (Esta es la parte en la que el algoritmo se llama asi mismo una y otra vez hasta llegar al caso base)

Hay varios tipos de recursividad pero todas siguen ese esquema.

Saludos!


Título: Re: Problema de entendimiento recursividad.
Publicado por: BlackZeroX en 20 Agosto 2011, 20:17 pm

1- Caso base. (Entiendelo como el caso en el que para y deja de llamarse asi mismo, dicho en plan chapuza  :xD)
2- Caso recursivo. (Esta es la parte en la que el algoritmo se llama asi mismo una y otra vez hasta llegar al caso base)


Caso base = llamada inicial (por algo se llama base )... por ende si fuera este el caso base el caso de termino, no seria recursivo. La recursividad termina hasta un Caso de termino. Una vez llegado al caso Termino se retornando TODO al caso Base aplicando la teoria de la PILA ( El ultimo es el primero en salir ). quizas esto era lo que querias decir realmente.

https://secure.wikimedia.org/wikipedia/es/wiki/Pila_%28inform%C3%A1tica%29
http://www.lcc.uma.es/~lopez/modular/recursion/transp_recursion.pdf
https://secure.wikimedia.org/wikipedia/es/wiki/Recursi%C3%B3n
https://secure.wikimedia.org/wikipedia/es/wiki/Algoritmo_recursivo

Por otro lado solo hay dos tipos de recursividad:

* Directa
* Indirecta

en los enlaces esta la explicacion.

Es como en algebra, debes empezar a resolver los parentesis mas internos... hasta dar con el resultado final.

Dulces Lunas!¡.


Título: Re: Problema de entendimiento recursividad.
Publicado por: axeelcs en 20 Agosto 2011, 20:37 pm
Muchisimas gracias a ambos !;
me quedo clarísimo :)
se los agradezco en serio .


Título: Re: Problema de entendimiento recursividad.
Publicado por: pucheto en 20 Agosto 2011, 20:44 pm
Caso base = llamada inicial (por algo se llama base )...
Perdon que me meta pero esto no es cierto, Caso Base es el caso terminal donde no se hace ninguna llamada recursiva. Inclusive lo dice en una de las paginas que mencionas...

PD: Y por curiosidad, que es eso de Dulces Lunas, Temibles Lunas ?


Título: Re: Problema de entendimiento recursividad.
Publicado por: Darkgold9 en 20 Agosto 2011, 20:55 pm
Citar
Caso base = llamada inicial (por algo se llama base )... por ende si fuera este el caso base el caso de termino, no seria recursivo. La recursividad termina hasta un Caso de termino. Una vez llegado al caso Termino se retornando TODO al caso Base aplicando la teoria de la PILA ( El ultimo es el primero en salir ). quizas esto era lo que querias decir realmente.

No he oido nunca hablar del "caso de termino", pero no lo pongo en duda, para mi el caso base es cuando el algoritmo para y empieza a resolverse (parecido a backtracking volviendo hacia atras...), supongo que queremos expresar lo mismo pero cada uno con distintos terminos.

Y en cuanto a los tipos de recursividad ami me enseñaron uno mas que era la recursividad Multiple aparte de los que citaste.

Saludos!


Título: Re: Problema de entendimiento recursividad.
Publicado por: BlackZeroX en 20 Agosto 2011, 21:34 pm
.
Yo lo conozco el caso Base como caso de termino. donde el stack deja de aumentar y se empiesan a retornar los resultados (Similar al BackTracking pero la recursividad esta mas ligada al Stack).

Igual y es un error de terminos.

Dulces Lunas!¡.