elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Estamos en la red social de Mastodon


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Estoy perdido con la recursividad
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Estoy perdido con la recursividad  (Leído 2,666 veces)
Caster


Desconectado Desconectado

Mensajes: 786


Ver Perfil WWW
Estoy perdido con la recursividad
« en: 3 Octubre 2012, 19:35 pm »

Pues estoy leyendo sobre la recursividad y estoy totalmente perdido, no entiendo nada, dice que las llamadas a la funcion no se realizan en el momento de la llamada, sino que se acumulan hasta cumpla una condicion, y despues se ejecutan en orden inverso, es decir, que la primera llamada que se hizo es la ultima en ejecutarse?
Alguien amable podria explicarme esto de una forma algo mas facil, porque estoy muy perdido.

Gracias

EDITO: a ver, algo creo que voy entendiendo, de ejemplo me trae este codigo:

Código
  1. #include <stdio.h>
  2.  
  3. #define EOLN '\n'
  4.  
  5. void inverso(void);
  6.  
  7. int main() {
  8. printf("Introduce una linea de texto debajo: \n");
  9. inverso();
  10. }
  11.  
  12. void inverso(void) {
  13. char c;
  14.  
  15. if((c = getchar) != EOLN) inverso();
  16. putchar(c);
  17. return;
  18. }

Antes de nada, no he compilado el codigo, voy a fiarme del libro, A ver si me explico y lo he entendido bien, este programa se supone que escribe el texto introducido al reves, ejemplo:

Citar
hola - aloh

Cuaado tu introduces una letra, por ejemplo a, no la escribe, sino que vuelve a llamar a la funcion, es decir entra en bucle ejecutando la linea:
Código
  1. if((c = getchar) != EOLN) inverso();
hasta que la condicion del if se cumpla, entonces como segun el libro el orden de las llamdas es inverso, la primera letra que introduje sera la ultima en mostrarse, y asi con el resto de caracteres, estoy en lo cierto?

Espero haberlo entendido bien, porque es el ultimo punto de este tema y estoy deseando pasar de tema, pero no sin antes haberlo entendido todo perfectamente.

Gracias de nuevo


« Última modificación: 3 Octubre 2012, 19:50 pm por Caster » En línea

Stakewinner00


Desconectado Desconectado

Mensajes: 1.426



Ver Perfil WWW
Re: Estoy perdido con la recursividad
« Respuesta #1 en: 3 Octubre 2012, 20:23 pm »

si basicamente es eso.

No se mucho de recursividad, pero algo e echo.

Yo tampoco lo entendia mucho hasta que practique con ello.

Yo directamente ya no me leo libros de programación sino que intento programar  ysi algo no lo se lo busco por google y luego lo implemento y ya se me queda grabado


En línea

leosansan


Desconectado Desconectado

Mensajes: 1.314


Ver Perfil
Re: Estoy perdido con la recursividad
« Respuesta #2 en: 3 Octubre 2012, 22:11 pm »

Citar
Te dejo como ejemplo la sucesión de fibonacci, que empieza con 1 y 1 y cada número es la suma de los dos anteriores:
1,1,2,3,5,8,13,21,34,55,.....:
Código
  1. #include <stdio.h>
  2.  
  3. long int fibonacci(long int  k);
  4. int main(void)
  5. {
  6.    int i;
  7.    for ( i=0; ;i++ )
  8.    {
  9.        if (fibonacci(i)>10000)  /*<==cuando supere este valor se para*/
  10.                break;
  11.        printf ("%ld    ",fibonacci(i));
  12.    }
  13.        printf ("%ld",fibonacci(i));
  14.    return 0;
  15. }
  16.  
  17. long int fibonacci(long int  k)
  18. {
  19.    if (k < 2)
  20.        return 1;
  21.    else
  22.        return fibonacci(k - 1) + fibonacci(k - 2);
  23. }
  24. /*
  25.           Por ejemplo, si llamo a  fibonacci(6) esto es lo que sucede:
  26.                             6    <==llamada a fibonacci(6),este llama fibonacci(5)+fibonacci(4)
  27.                                                     llamada a fibonacci(5),este llama fibonacci(4)+fibonacci(3)
  28.                  5 ...................... 4 <==
  29.                                                     Y llamada a fibonacci(4),este llama fibonacci(3)+fibonacci(2)
  30.                                                         y así sucesivamente.....fíjate que
  31.             4.......3              3.........2      en cada llamada se resta uno hasta
  32.                                                             que es uno.
  33.         3.......2 2.....1       2.......1        1
  34.  
  35.     2.......1   1 1     1       1       1           1
  36.     1   +   1 + 1+1  +  1 +     1  +    1    +      1 =8 =fibonacci(6)
  37.  
  38. Como dice tu libro "la primera llamada que se hizo,en este caso fibonacci(6), es la ultima en ejecutarse"*/
  39.  

Otro ejemplo más simple que calcula el factorial:
Código
  1. #include <stdio.h>
  2. long fact(int n)
  3. {
  4.    if (n==1)
  5.        return 1;
  6.    return n * fact (n-1);
  7. }
  8. main() {
  9. int num;
  10. printf("Introduzca un número entero: ");
  11. scanf("%d", &num);
  12. printf("Su factorial es: %ld\n", fact(num));
  13. }
  14. /*por ejemplo: num=6 ==>fact (6))
  15.  
  16. return:6*fact (5)
  17.     return:6*5*fact (4)
  18.          return:6*5*4*fact (3)
  19.                 return:6*5*4*3*fact (2)
  20.                     return:6*5*4*3*2*fact (1)
  21.                         return:6*5*4*3*2*1
PD:tú código no funciona.
Saludos!.
« Última modificación: 5 Octubre 2012, 14:23 pm por leosansan » En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Estoy perdido con la recursividad
« Respuesta #3 en: 5 Octubre 2012, 17:32 pm »

Antes de nada, no he compilado el codigo, voy a fiarme del libro
Al parecer al copiar el programa agregaste (de forma accidental, por supuesto) algunos errores o bien el libro no es de calidad. ¿Que libro estas leyendo?

Hay varias partes a modificar en la función "inverso":

* Faltan los paréntesis en la llamada a "getchar".
* El tipo de retorno de "getchar" es "int".
* Si "getchar" por alguna razón falla a partir de ese momento retorna "EOF" y como este valor es distinto de '\n' se entra en una recursion infinita.
* No es necesaria la sentencia "return;" al final de la función, esta retorna al encontrarse su llave de cierre '}'.

El programa con las correcciones:
Código
  1. #include <stdio.h>
  2.  
  3. void inverso(void);
  4.  
  5. int main(void)
  6. {
  7.   puts("Introduce una linea de texto debajo:");
  8.   inverso();
  9.   return 0;
  10. }
  11.  
  12. void inverso(void)
  13. {
  14.   int c;
  15.  
  16.   if ((c = getchar()) == '\n')
  17.      putchar('\n');
  18.   else if (c != EOF){
  19.      inverso();
  20.      putchar(c);
  21.   }
  22. }

Un saludo
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
Caster


Desconectado Desconectado

Mensajes: 786


Ver Perfil WWW
Re: Estoy perdido con la recursividad
« Respuesta #4 en: 5 Octubre 2012, 19:19 pm »

Gracias leosansan por los ejemplos, el de calcular el factorial es el primer ejemplo que viene en mi libro.


Al parecer al copiar el programa agregaste (de forma accidental, por supuesto) algunos errores o bien el libro no es de calidad. ¿Que libro estas leyendo?
Si, ha sido error mio al copiar el programa, aqui esta sin ningun fallo, exactamente como en el libro:

Código
  1. #include <stdio.h>
  2.  
  3. #define EOLN '\n'
  4.  
  5. void inverso(void);
  6.  
  7. int main() {
  8. printf("Introduce una linea de texto debajo: \n");
  9. inverso();
  10. }
  11.  
  12. void inverso(void) {
  13. char c;
  14.  
  15. if((c = getchar()) != EOLN) inverso();
  16. putchar(c);
  17. return;
  18. }

Lo he compilado y funciona perfectamente,gracias por las correcciones, creo que ya he entendido mas o menos la recursividad y ademas en mi libro viene como apunte que no se suele utilizar mucho, y que problemas que se puede solucionar con la recursividad se puede hacer de manera mas facil de otras maneras, asi que tampoco me voy a parar mucho en ella.

Saludos
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
carrito ¿voy bien? o ¿deplano estoy muy perdido?
WarZone
zerocoolcom 1 3,148 Último mensaje 15 Agosto 2012, 00:26 am
por alvarosanes
Estoy perdido... Visual Basic 2013
Programación Visual Basic
old.dude 2 2,046 Último mensaje 5 Julio 2014, 15:17 pm
por old.dude
Estoy perdido ...
Dudas Generales
FKT 1 2,203 Último mensaje 10 Agosto 2015, 18:20 pm
por Randomize
Ayuda, estoy perdido con este Binario
Ingeniería Inversa
FFernandez 0 3,371 Último mensaje 18 Octubre 2021, 18:33 pm
por FFernandez
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines