Test Foro de elhacker.net SMF 2.1

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).


#include <stdio.h>
#define SIZE 10

void someFunction(int [], int);


main()
{
 int a[SIZE] = {32, 27, 64, 18, 95, 14, 90, 70, 60 ,37};

 printf("Los valores en el arreglo son: ");
 someFunction(a, SIZE);
 printf("\n");
 return 0;
}


void someFunction(int b[], int size)
{
 if(size > 0)
 {
   someFunction(&b[1], size - 1);
   printf("%d ", b[0]);
 }
}


Salida:

CitarLos 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:

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:

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
    someFunction(&b[1], size - 1);
    printf("%d ", b[0]);


Por esto

    printf("%d ", b[0]);
        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
Cita de: 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?

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