[C] - Recursividad problema

Iniciado por cbug, 4 Julio 2010, 00:36 AM

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

cbug

Hola, estoy repasando nuevamente lo que sé hasta el momento y se me cruzó por la cabeza resolver recursivamente un conteo de vocales, quisiera saber si ustedes creen que es la manera correcta de resolverlo, si existen mejores soluciones... etc

#include <stdio.h>

#define ptrNULL 0

int es_vocal(char c)
{
  /* Aqui se presento la situacion de un switch
      no se precisamente cual solucion es la mejor
*/
 char conjunto[] = {'a','e', 'i', 'o', 'u'};
 int i;
 for(i = 0; i < 5; i++)
   if(c == conjunto[i]) return 1;
 return 0;
}

unsigned int contar_vocal(char *palabra)
{
 if(*palabra == ptrNULL)
   return 0;
 else
   if(es_vocal(tolower(*palabra)))
   {
     palabra++;
     return (1 + contar_vocal(palabra));
   }
   else
   {
     palabra++;
     return contar_vocal(palabra);
   }
}

int main()
{
 char *s = "MUrCiELagO";
 int cnt;
 cnt = contar_vocal(s);
 printf("\nCantidad > %d\n", cnt);
 return 0;
}

MIG80

#1
Otra solución:

#include <stdio.h>
#include <ctype.h>

int esvocal(char c);

int main(void)
{
 char *pchar,str[]="MurCieLago";
 int nv=0;

 for(pchar=str;*pchar;pchar++)
 {
    if(esvocal(*pchar))
      nv++;
 }
 printf("Cantidad de vocales:%d\n",nv);
 
 return 0;
}

int esvocal(char c)
{
 c=tolower(c);
 return (c=='a'||c=='e'||c=='i'||c=='o'||c=='u');
}


Opino que las soluciones recursivas solo deben ser utilizadas cuando hacen más facil el entender el problema. Como en el caso de las torres de hanoi por ejemplo.

cbug

De cierta manera, es otra forma de resolverlo, pero sin recursividad...

Respecto a tu opinión, por el momento no tengo un argumento fuerte para poner en discusión...

nicolas_cof

cbug, te falta incluir la libreria ctype.h para la funcion tolower()

Aca dejo otro codigo...

#include <stdio.h>
#include <ctype.h>

int contarVocales( char *palabra )
{
    char c;

    if ( *palabra == '\0' )
    {
        return 0;
    }
    else
    {
        c = tolower( *palabra );
        if ( c == 'a' || c == 'e' || c == 'i' || c == 'o' || c == 'u' )
        {
            return ( 1 + contarVocales( ++palabra ) );
        }
        else
        {
            return contarVocales( ++palabra );
        }
    }
}

int main( void )
{
    char *s = "MUrCiELagO";
    printf("Cantidad: %d\n", contarVocales( s ) );
    return 0;
}


Salu10.

cbug

Cierto, ahora una pregunta, tu que estás más adentrado en el tema...

Es más conveniente hacer un bucle de búsqueda de "vocal", o hacer una comparación ya sea mediante un if() o switch()?

Horricreu

#5
Cita de: cbug en  4 Julio 2010, 14:28 PM
Cierto, ahora una pregunta, tu que estás más adentrado en el tema...

Es más conveniente hacer un bucle de búsqueda de "vocal", o hacer una comparación ya sea mediante un if() o switch()?

Yo lo que haría, es un puntero a la matriz y, con un bucle que la vaya recorriendo. Luego le añades un if() para buscar la letra.

Saludos :P

cbug


Horricreu

#7
Cita de: cbug en  4 Julio 2010, 16:04 PM
No comprendo.

Es lo que hizo czealt, pero te explico la parte dónde busca:

Código (cpp) [Seleccionar]
char str[] = "MurCieLago";
char *pchar = str;

for(; *pchar; pchar++)
{
if(esvocal(*pchar))

//...


Primero creas una matriz con la palabra deseada, en este caso: murciélago; seguidamente, creamos un puntero que va a apuntar a la matriz creada; luego en el for(), con el puntero creado vamos recorriendo el CONTENIDO de la matriz, o sea los carácteres, y dentro de este for(), le hacemos un if() para comprobar si existe una vocal. ¿Entiendes? Te lo puedo explicar mejor si quieres :) Aunque esta sería mi forma de hacerlo :P

Saludos :P
   

cbug

Ah, claro... me confundí, porque pensé que hacías referencia a mi última pregunta... Porque en realidad estaba tratando el tema de recursividad antes que el método iterativo  :xD

do-while

¡Buenas!

Si te referias a comprobar si un caracter es una vocal tambien puedes utilizar este metodo.

int esvocal(char c)
{
   char vocales[]="aeiou";

   return (strchr(vocales , tolower(c)) != NULL);
}


Y bueno, el metodo recursivo que haas planteado es correcto, aunque prefiero el iterativo.

¡Saludos!
- Doctor, confundo los números y los colores.
- Vaya marrón.
- ¿Marrón? ¡Por el culo te la hinco!