[C] Llenar arreglo con recursividad

Iniciado por edr89, 4 Noviembre 2013, 19:31 PM

0 Miembros y 1 Visitante están viendo este tema.

edr89

Hola, he buscado información sobre recursividad pero en su mayoria son algoritmos de busqueda y ordenamiento, debo crear un arreglo de tamaño n e imprimirlo en pantalla de modo que forme un rectangulo, es decir, si el usuario elige 4, el resultado es:

1 1 1 1
1 1 1 2
1 1 2 3
1 2 3 4


Cada elemento se guarda en el arreglo de forma recursiva, cómo funciona esto?.

Poco he hecho con recursividad y estoy mas acostumbrado a trabajar con iteraciones, en este caso se me ha ocurrido trabajar con ciclos for() para ir procesando renglon por renglon pero no es recursividad.

   1. Si la funcion se llama a si misma el arreglo se crea dentro o fuera de la funcion? es local o global?
   2. Puedo reservar espacio dinamico para el arreglo del tamaño que indica el usuario? es decir:x = malloc(sizeof(int) * n);
   3. Al llamar a la función el arreglo se pasa como parametro? si es que se crea fuera de la funcion
   
Mi problema es desarrollar el algoritmo para guardar la secuencia de numeros , por favor si alguien me puede orientar se lo agradeceré.

Saludos!

xiruko

Igual no es la mejor solución pero funcionar funciona:

#include <stdio.h>
#include <stdlib.h>

void Procesar(int *p, int nelem, int nrestantes);

int main()
{
int nelem, i;
int *arreglo;

printf("Introduce la cantidad de elementos: ");
scanf(" %d", &nelem);
arreglo=malloc(nelem*sizeof(int));

// inicializacion
for (i=0; i<nelem; i++) arreglo[i]=1;

// funcion recursiva para procesar y mostrar por pantalla el arreglo
Procesar(arreglo, nelem, nelem);

free(arreglo);
return 0;
}

void Procesar(int *p, int nelem, int nrestantes)
{
int i;

// procesar arreglo
for (i=0; i<(nelem-nrestantes); i++) p[nelem-1-i]++;

// imprimirlo
for (i=0; i<nelem; i++) printf("%d", p[i]);
printf("\n");

// procesar siguiente etapa
if (nrestantes>1) Procesar(p, nelem, nrestantes-1);
}


Saludos!

edr89

#2
Cita de: xiruko en  4 Noviembre 2013, 21:30 PM
Igual no es la mejor solución pero funcionar funciona

cambie un para de cosas para poder entender el proceso y me quedo algo asi:
void Procesar(int *p, int nelem, int nrestantes)
{
    int i=0,j=0;
    // procesar arreglo
    for(i=0;i<(nelem - (nelem - nrestantes));i++)
    {
        p[i]=1;
    }
    if((nelem - nrestantes) !=0)
        {
            for(i=nrestantes,j=2;i<nelem;i++)
            {
                p[i]= (j);
                j++;
            }
        }
    for (i=0; i<nelem; i++)
    {
        printf("%d ", p[i]);
    }
    putchar('\n');
    // procesar siguiente etapa
    if (nrestantes>1)
    {
        Procesar(p, nelem, nrestantes-1);
    }
}