recursividad C

Iniciado por dabaji, 12 Julio 2012, 01:31 AM

0 Miembros y 2 Visitantes están viendo este tema.

dabaji

Hola tengo una duda para hacer estos ejercicios a ver si me ayudan:

1)Desarrolle una función recursiva para calcular la cantidad de veces que se puede dividir
un número entero x (leído desde la terminal) por dos.

2). Desarrolle una función recursiva para convertir un número pasado como parámetro y
que lo convierta a otro con sus dígitos escritos al revés. Ejemplo: f(4532) debe producir
el número 2354. Escriba un programa main() que ingresa un número desde el teclado y
luego use la función para calcular el mismo al revés.

DickGumshoe

¿Qué has intentado? Es para poder ayudarte con tus dudas  :D

Saludos

dabaji

en la 2) intente esto:
#include <stdlib.h>
#include <stdio.h>

void funcionRecursiva (int n)
{
    int numero;

    if (numero == '\0') return;

    funcionRecursiva(n+1);


    return;


}


int main (void)

{

    int f,funcion;

    printf ("Ingrese el numero\n");
    printf ("%d", &f);

    funcion=funcionRecursiva (0);


    printf ("El resultado es:%d",funcion);

   return 0;
}

pero falta cosas como para invocar en main...

DickGumshoe

Bueno, empiezo poco a poco:

Si en main() llamas a la función y le vas a asignar un valor a una variable a partir de esta, la función debe devolver algo, no ser void (a parte, en la función pones "return;", a pesar de que no devuelves nada y la función es void).

El número no va a ser nunca un '\0', no estás trabajando con cadenas de caracteres...

Ah, y en main() debes pasarle como parámetros a funcionRecursiva la variable f, no el número 0.

Respecto al algoritmo para invertir el número... Podrías averiguar cuántas cifras tiene el número (en otra función), dividiendo entre 10 el número int hasta que te de 0. Entonces, una vez tengas eso, se lo pasas por parámetros a la función recursiva. Entonces, sabiendo, por ejemplo, que el número 123 tiene 3 cifras, puedes hacer esto:

resultado = (num % 10) * 10^2;
num/10;

Así, de forma recursiva, invertirás el número. Seguramente haya alguna forma más sencilla de explicar, pero es lo que se me ha ocurrido ahora mismo  :( .

Saludos.

dato000

Dejo lo que DickGumshoe quiso decir con estas correcciones.


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

void funcionRecursiva (int n)
{
   int numero;
   numero = funcionRecursiva(n+1);
   do{
       resultado = (numero % 10) * 10^2;
       numero/10;
       numero = funcionRecursiva(n+1);
   }while(numero>0);

   printf ("El resultado es:%d", numero);

}


int main (void)

{
   int f, funcion;
   printf ("Ingrese el numero\n");
   printf ("%d", &f);
   funcion=funcionRecursiva (f);

  return 0;
}


No lo probe, pero es una idea general, no es la solucion, pero es para que tengas una noción de como va la cosa.


En el primer punto pues no termine de entender, pues si la pregunta es cuantas veces se puede dividir un numero (sea entero o coma flotante) pues se puede hacer infinitamente. Ahora, si se necesta saber cuantas veces se puede dividir siempre y cuando el resultado sea entero, pues si es impar ya no sirve, y si es par, pues debe ser hasta que sea mayor o igual a 1, son cosas que deben tenerse en cuenta, y pues no se cual sea tu caso.



DickGumshoe

Dividiendo entre 10 un número entero y sumándole uno al contador hasta que el resultado sea 0 es como puedes contar el número de cifras (ya que en un int solo te coge la parte entera, y por tanto llegará a ser 0).

dato000, tu código tiene algunos errores... Para pedir datos debes usar scanf, no printf, y en:

resultado = (numero % 10) * 10^2;

Donde tienes puesto el 2, es una variable que empieza en el número de cifras y se va restando uno... Lo entenderás mejor cuando deje el código:

#include <stdio.h>
#include <math.h>

int num_dividir(int n)
{
   int i=0;
   while(n > 0)
   {
       n /= 10;
       i++;
   }
   return i;
}

int funcionRecursiva (int n, int cifras, int resultado)
{
   if(cifras <= 0) return resultado/10;
   else
   {
       resultado += (n % 10) * pow(10,cifras);
       n /= 10;
       cifras--;
       return funcionRecursiva(n, cifras, resultado);
   }
}



int main ()

{
   int f, funcion, div, resultado;
   printf ("Ingrese el numero\n");
   scanf ("%d", &f);
   div = num_dividir(f); //Numero de cifras
   resultado = funcionRecursiva(f, div, 0);
   printf("El numero invertido es: %d", resultado);

  return 0;
}


No lo he probado, pero creo que funciona bien.

Saludos!

dato000

Cita de: DickGumshoe en 12 Julio 2012, 18:54 PM

dato000, tu código tiene algunos errores... Para pedir datos debes usar scanf, no printf, y en:


ups, se me paso, como dije no probe, solo vi por encima jajaja

voy a esperar a ver que dice el muchacho que abrio el post si tiene más dudas y comienzo a implementar, hasta entonces.