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

 

 


Tema destacado: Introducción a Git (Primera Parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ¿Por que se imprime el arreglo al revez? [C]
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿Por que se imprime el arreglo al revez? [C]  (Leído 2,776 veces)
UsuarioZ

Desconectado Desconectado

Mensajes: 64


Ver Perfil
¿Por que se imprime el arreglo al revez? [C]
« 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


« Última modificación: 6 Enero 2020, 01:08 am por UsuarioZ » En línea

K-YreX
Moderador
***
Desconectado Desconectado

Mensajes: 1.008



Ver Perfil
Re: ¿Por que se imprime el arreglo al revez? [C]
« Respuesta #1 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.


En línea

Código
  1. cout << "Todos tenemos un defecto, un error en nuestro código" << endl;
AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: ¿Por que se imprime el arreglo al revez? [C]
« Respuesta #2 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!
En línea

UsuarioZ

Desconectado Desconectado

Mensajes: 64


Ver Perfil
Re: ¿Por que se imprime el arreglo al revez? [C]
« Respuesta #3 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.
« Última modificación: 6 Enero 2020, 03:39 am por UsuarioZ » En línea

AlbertoBSD
Programador y
Moderador Global
***
Desconectado Desconectado

Mensajes: 3.696


🏴 Libertad!!!!!


Ver Perfil WWW
Re: ¿Por que se imprime el arreglo al revez? [C]
« Respuesta #4 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
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines