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