Recursividad

Iniciado por david_BS, 19 Abril 2012, 05:47 AM

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

david_BS

Hola, hice un programita tonto que utiliza una función recursiva, solamente para mostrar algunos detalles..

El programa se trata de tener un texto que debe ser superior a los 168 caracteres, ya sea en un array o para ser ingresado, luego el texto debe ser manejado por un puntero char* y debe ser examinado por una función recursiva.

con un sólo llamado a la función recursiva en el main, se debe poder obtener ciertos datos del texto.

1) cantidad de letras
2) cantidad de vocales
3) cantidad de consonantes
4) cantidad de espacios

El programa requiere el uso de aritmética de punteros como van a ver en el código.

además esta técnica es dependiente de un vector declarado como 'static' para que no cambie su dirección en memoria y pueda ser accesible durante todo el programa.

dejo el código a continuación..

Este sería el texto contenido en un array

char texto[200] = {


'a','s','d','x','x','x','x','x','x','x',
'x','a','s','d','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x',' ','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x','x',
'a','s','d','x','x','x','x','x','x',0};


Esta es la función recursiva. devuelve un puntero a vector int de 4.
El número 4 hace referencia a los 4 resultados que debemos obtener del texto.

int* arreglo_final_re(char* str, char letra){

static int vec[4]={0};
int estado=0;
if(*str!=NULL){
if(*str==letra) estado=1;
if((*str=='a')||(*str=='e')||(*str=='i')||(*str=='o')||(*str=='u')) estado=2;
if((*str!='a')&&(*str!='e')&&(*str!='i')&&(*str!='o')&&(*str!='u')) estado=3;
if(*str==' ') estado=4;
str++;
for(unsigned int i=1; i<=estado;i++){
if(estado==3&&i==2)continue;
if(estado==4&&(i==2||i==3))continue;
vec[i-1]++;
}

//arreglo_final_re(str,letra);//esto dejaria en la pila varios ret+address los cuales deben popearse luego..
return arreglo_final_re(str,letra);
}

printf("----------------------------------------\n");
printf("cantidad letras: %d\n",vec[0]);
printf("cantidad vocales: %d\n",vec[1]);
printf("cantidad consonantes: %d\n",vec[2]);
printf("cantidad blancos: %d\n",vec[3]);
printf("----------------------------------------\n");
printf("----------------------------------------\n");
printf("Direccion del vector static: %x\n",vec);
printf("----------------------------------------\n");

return &vec[0];

}


Este sería el punto de entrada del programa

int main(){

char* t = texto;
printf("Texto: %s\n",t);
printf("----------------------------------------\n");

int* p =arreglo_final_re(t,'x');
printf("----------------------------------------\n");
printf("Direccion rescatada desde el Main: %x\n",p);
printf("----------------------------------------\n");
printf("Letras: %d\n",*(p+0));
printf("Vocales: %d\n",*(p+1));
printf("Consonantes: %d\n",*(p+2));
printf("Blancos: %d\n",*(p+3));
printf("----------------------------------------\n");

system("pause");
return 0;
}



dejo el proyecto en MSVC++ 6.0 por si lo desean descargar

Proyecto





luke92

Muy buen aporte!
Lo vi anteriormente en una entrevista de Java trainee, es algo basico en programación. Si lo analizas bien, funciona como un while o un for.
Software Libre o Muere