Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: cbug en 4 Julio 2010, 00:36 AM

Título: [C] - Recursividad problema
Publicado por: cbug en 4 Julio 2010, 00:36 AM
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;
}
Título: Re: [C] - Recursividad problema
Publicado por: MIG80 en 4 Julio 2010, 02:03 AM
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.
Título: Re: [C] - Recursividad problema
Publicado por: cbug en 4 Julio 2010, 03:27 AM
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...
Título: Re: [C] - Recursividad problema
Publicado por: nicolas_cof en 4 Julio 2010, 06:34 AM
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.
Título: Re: [C] - Recursividad problema
Publicado por: 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()?
Título: Re: [C] - Recursividad problema
Publicado por: Horricreu en 4 Julio 2010, 15:29 PM
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
Título: Re: [C] - Recursividad problema
Publicado por: cbug en 4 Julio 2010, 16:04 PM
No comprendo.
Título: Re: [C] - Recursividad problema
Publicado por: Horricreu en 4 Julio 2010, 16:42 PM
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
   
Título: Re: [C] - Recursividad problema
Publicado por: cbug en 4 Julio 2010, 16:49 PM
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
Título: Re: [C] - Recursividad problema
Publicado por: do-while en 4 Julio 2010, 18:31 PM
¡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!
Título: Re: [C] - Recursividad problema
Publicado por: cbug en 4 Julio 2010, 18:39 PM
La verdad que no había pensado en esa función...  :D

Si... es cierto que el método iterativo es mucho mejor...