¿Por que se imprime el arreglo al revez? [C]

Iniciado por UsuarioZ, 6 Enero 2020, 00:20 AM

0 Miembros y 2 Visitantes están viendo este tema.

UsuarioZ

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

K-YreX

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.
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

AlbertoBSD

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!
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW

UsuarioZ

#3
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.

AlbertoBSD

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
Donaciones
1Coffee1jV4gB5gaXfHgSHDz9xx9QSECVW