Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: UsuarioZ en 6 Enero 2020, 00:20 am



Título: ¿Por que se imprime el arreglo al revez? [C]
Publicado por: UsuarioZ en 6 Enero 2020, 00:20 am
Empieza a imprimir por el ultimo elemento (37).

Código
  1. #include <stdio.h>
  2. #define SIZE 10
  3.  
  4. void someFunction(int [], int);
  5.  
  6.  
  7. main()
  8. {
  9.  int a[SIZE] = {32, 27, 64, 18, 95, 14, 90, 70, 60 ,37};
  10.  
  11.  printf("Los valores en el arreglo son: ");
  12.  someFunction(a, SIZE);
  13.  printf("\n");
  14.  return 0;
  15. }
  16.  
  17.  
  18. void someFunction(int b[], int size)
  19. {
  20.  if(size > 0)
  21.  {
  22.    someFunction(&b[1], size - 1);
  23.    printf("%d ", b[0]);
  24.  }
  25. }
  26.  

Salida:

Citar
Los valores en el arreglo son: 37 60 70 90 14 95 18 64 27 32


Título: Re: ¿Por que se imprime el arreglo al revez? [C]
Publicado por: K-YreX en 6 Enero 2020, 03:04 am
Eso es porque primero tienes la llamada recursiva y después la instrucción de mostrar.

Lo que hace tu programa es:
Código:
Llamar a mostrar desde la posicion 0
  Llamar a mostrar desde la posicion 1
    Llamar a mostrar desde la posicion 2
      Llamar a mostrar desde la posicion 3
        //...
          Llamar a mostrar desde la posicion SIZE-1
          // AQUI ACABA LA RECURSIVIDAD Y AHORA EMPIEZA A MOSTRAR DESDE DENTRO HACIA FUERA
          Mostrar la posicion SIZE-1
        //...
      Mostrar la posicion 3
    Mostrar la posicion 2
  Mostrar la posicion 1
Mostrar la posicion 0

Lo único que tienes que hacer es cambiar el orden de las dos instrucciones haciendo que primero muestre y después se llame de nuevo. Así el esquema sería:
Código:
Llamar a mostrar desde la posicion 0
  Mostrar la posicion 0
  Llamar a mostrar desde la posicion 1
    Mostrar la posicion 1
    Llamar a mostrar desde la posicion 2
    //...
      Mostrar la posicion SIZE-2
      Llamar a mostrar desde la posicion SIZE-1
        Mostrar la posicion SIZE-1
        FIN // Si hubiese mas instrucciones despues de la llamada recursiva se harian aqui
      FIN // Si hubiese mas instrucciones despues de la llamada recursiva se harian aqui
    //...
  FIN // Si hubiese mas instrucciones despues de la llamada recursiva se harian aqui
FIN // Si hubiese mas instrucciones despues de la llamada recursiva se harian aqui

Al final lo importante en esto es entender cómo funciona la recursividad, más que conseguir el resultado esperado a prueba y error.


Título: Re: ¿Por que se imprime el arreglo al revez? [C]
Publicado por: AlbertoBSD en 6 Enero 2020, 03:05 am
Por que estas llamando a una funcion recursiva prinmero y depues imprimes el numero, por eso solo empezara con el printf del ultimo elemento en la pila de llamadas a la funcion     someFunction


Si cambias esto
Código
  1.    someFunction(&b[1], size - 1);
  2.    printf("%d ", b[0]);

Por esto

Código
  1.    printf("%d ", b[0]);
  2.        someFunction(&b[1], size - 1);

Ahora si imprimiera el Arreglo en Orden correcto.

Saludos!


Título: Re: ¿Por que se imprime el arreglo al revez? [C]
Publicado por: UsuarioZ en 6 Enero 2020, 03:26 am
Ahh, o sea que las instrucciones que estén antes de la llamada se ejecutan mientras se acerca al caso base y las que están después mientras se aleja?

Gracias.


Título: Re: ¿Por que se imprime el arreglo al revez? [C]
Publicado por: AlbertoBSD en 6 Enero 2020, 03:41 am
Ahh, o sea que las instrucciones que estén antes de la llamada se ejecutan mientras se acerca al caso base y las que están después mientras se aleja?

No entendi, pero mi Si tomas un cuaderno y anotas paso por paso lo que se esta haciendo. Ejemplo:

Primera llamada
size  = 10
&b[1] = 27
someFunction(&b[1], size - 1);

Segunda llamada
size  = 9
&b[1] = 64
someFunction(&b[1], size - 1);
....

Y ya en la llamada final

size = 1
&b[1] = 37
someFunction(&b[1], size - 1);

Y ahora empiezan los printf:

printf("%d ", b[0]);
b[0] = 37

...

Etc