Test Foro de elhacker.net SMF 2.1

Programación => Programación C/C++ => Mensaje iniciado por: sora_ori en 7 Abril 2014, 21:46 PM

Título: Función en recursividad
Publicado por: sora_ori en 7 Abril 2014, 21:46 PM
Hola, a ver si me pueden corregir este programa en C jeje

Programa que pedirá un número entero y hace una función int f2x3 con:

1) Si "n" es 1 escribirá "n" por pantalla y devolverá un 1.
2) Si "n" no es 1 y si es múltiplo de 2 y es múltiplo de 3 escribirá "n" por pantalla y
llamará a f2x3 con el valor n+5.
3) Si "n" no es 1 y es múltiplo de 2 pero no es múltiplo de 3 escribirá "n" por
pantalla y llamará a f2x3 con el valor n/2.
4) Si "n" no es 1 y es múltiplo de 3 pero no es múltiplo de 2 escribirá "n" por
pantalla y llamará a f2x3 con el valor n+2.
5) Si "n" no es 1 y no es múltiplo de 2 ni múltiplo de 3 escribirá "n" por pantalla
y llamará a f2x3 con el valor n-1.

Ejemplo: Si introducimos un 18

Escribirá por pantalla: 18,23,22,11,10,5,4,2,1 Total: 9 llamadas


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

#define FALSE 0
#define TRUE 1

/* Declaracion de las funciones */
unsigned int f2x3 (int);

/* Menu principal */
int main(void){
    unsigned int n; // Variable "n" donde se guarda el numero y que utilizará la funcion
   
    printf("Escribe un numero: ");
    fflush(stdin);
    scanf("%d", &n); // guardamos el numero introducido
   
    printf("\nTotal de llamadas: %d \n", f2x3(n)); // Mostramos el total de llamadas de la funcion
   
    getch();       
    return 0;
} // Fin main

/* Funcion */
unsigned int f2x3 (int n) {
   
    printf("%i ", n); // Listamos los numeros que va llamando la funcion
   
    if (n == 1) return 1; // Primer caso, si el valor es igual a 1 entonces retornará 1
    if ((n != 1) && (n % 2 == 0) && (n % 3 == 0)) return f2x3(n+5); // Caso II
    if ((n != 1) && (n % 2 == 0) && (n % 3 != 0)) return f2x3(n/2); // Caso III
    if ((n != 1) && (n % 2 != 0) && (n % 3 == 0)) return f2x3(n+2); // Caso IV
    if ((n != 1) && (n % 2 != 0) && (n % 3 != 0)) return f2x3(n-1); // Caso V
   
} // Fin de la funcion



Gracias y un saludo
Título: Re: Función en recursividad
Publicado por: NikNitro! en 7 Abril 2014, 22:00 PM
Pides corregir.. En qué te falla?

Saludos;)

PD: Yo usaría mas que muchos if una estructura switch.
Título: Re: Función en recursividad
Publicado por: sora_ori en 7 Abril 2014, 22:05 PM
En el ejemplo que he dado si pongo 18 me dice que el total de llamadas es "1" cuando en verdad son 9.


Saludos
Título: Re: Función en recursividad
Publicado por: NikNitro! en 7 Abril 2014, 22:22 PM
Ah vale. Eso ya no lo sabía xD
Es fácil. Crea al principio un int numLlamadas = 0; y en cada if abres llave y pones numLlamadas++; y el return correspondiente

Saludos ;)

EDITO: Y que después imprima ese numLlamadas.

EDITO2: Aquí tienes el código como lo modificaría yo:

EI: no hace falta dar el codigo, gracias.
Título: Re: Función en recursividad
Publicado por: sora_ori en 7 Abril 2014, 22:44 PM
Muchas gracias!

Tenía ya la variable "n" para el total de llamadas.
Título: Re: Función en recursividad
Publicado por: NikNitro! en 7 Abril 2014, 23:03 PM
Pero la usabas para dos cosas distintas por lo que no te funcionaría.

Salud.
Título: Re: Función en recursividad
Publicado por: sora_ori en 7 Abril 2014, 23:08 PM
Me esta dando un error y llevo un rato intentando ver que es y no lo encuentro.


En esta parte:

    if (n == 1) return 1; // Primer caso, si el valor es igual a 1 entonces retornará 1
    else { //CAMBIADO
      (n % 2 == 0) && (n % 3 == 0) i=n+5; // Caso II //CAMBIADO
      (n % 2 == 0) && (n % 3 != 0) i=n/2; // Caso III //CAMBIADO
      (n % 2 != 0) && (n % 3 == 0) i=n+2; // Caso IV //CAMBIADO
      (n % 2 != 0) && (n % 3 != 0) i=n-1; // Caso V //CAMBIADO
    } //CAMBIADO
   
    numLlamadas++; //CAMBIADO


Error: syntax error before "i"
Título: Re: Función en recursividad
Publicado por: NikNitro! en 7 Abril 2014, 23:31 PM
@EternalIdol, solo di el código modificado en vez de enumerar uno a uno los cambios. Es mas, el código era el suyo, por lo que creo que no rompí las normas. -.-
@sora no puedo responderte puesto que no veo el codigo que puse -.-

Salud
Título: Re: Función en recursividad
Publicado por: Eternal Idol en 8 Abril 2014, 00:35 AM
Cita de: NikNitro! en  7 Abril 2014, 23:31 PM@EternalIdol, solo di el código modificado en vez de enumerar uno a uno los cambios. Es mas, el código era el suyo, por lo que creo que no rompí las normas. -.-

Si podias explicar los cambios necesarios para solucionar el problema y no publicar el codigo arreglado quiere decir que era innecesario.
Título: Re: Función en recursividad
Publicado por: NikNitro! en 8 Abril 2014, 00:44 AM
Y qué diferencia hay? Además, lo del else era una forma diferente de hacerlo... Bueno no discuto más. Sora, si quieres ejercicios resueltos, tengo mi blog en la firma ;)

Salud
Título: Re: Función en recursividad
Publicado por: Eternal Idol en 8 Abril 2014, 00:46 AM
Cita de: NikNitro! en  8 Abril 2014, 00:44 AM
Y qué diferencia hay? Además, lo del else era una forma diferente de hacerlo... Bueno no discuto más. Sora, si quieres ejercicios resueltos, tengo mi blog en la firma ;)

Salud

Que hagan algo mas que copiar y pegar, es lo minimo, sino estamos haciendo tareas ajenas directamente.
Título: Re: Función en recursividad
Publicado por: sora_ori en 8 Abril 2014, 22:42 PM
Gracias por la ayuda "NikNitro!", te lo agradezco!

El código lo llevo así:

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

#define FALSE 0
#define TRUE 1
int numLlamadas = 0; //CAMBIADO

/* Declaracion de las funciones */
unsigned int f2x3 (int);

/* Menu principal */
int main(void){
    unsigned int n; // Variable "n" donde se guarda el numero y que utilizará la funcion

    printf("Escribe un numero: ");
    fflush(stdin);
    scanf("%d", &n); // guardamos el numero introducido

    printf("\nTotal de llamadas: %d \n", numLlamadas); // Mostramos el total de llamadas de la funcion //CAMBIADO

    getch();       
    return 0;
} // Fin main

/* Funcion */
unsigned int f2x3 (int n) {
    int i = 0;      //El siguiente número que usaremos  //CAMBIADO
    printf("%i ", n); // Listamos los numeros que va llamando la funcion

    if (n == 1) return 1; // Primer caso, si el valor es igual a 1 entonces retornará 1
    else { //CAMBIADO
      (n % 2 == 0) && (n % 3 == 0) i=n+5; // Caso II //CAMBIADO
      (n % 2 == 0) && (n % 3 != 0) i=n/2; // Caso III //CAMBIADO
      (n % 2 != 0) && (n % 3 == 0) i=n+2; // Caso IV //CAMBIADO
      (n % 2 != 0) && (n % 3 != 0) i=n-1; // Caso V //CAMBIADO
    } //CAMBIADO
   
    numLlamadas++; //CAMBIADO
    return f2x3(i); //CAMBIADO
} // Fin de la funcion




El error que me da es el siguiente:

In function `f2x3':
syntax error before "i"
Título: Re: Función en recursividad
Publicado por: noele1995 en 8 Abril 2014, 23:12 PM
Bueno el error te da por este codigo (n % 2 == 0) && (n % 3 == 0) i=n+5; // Caso II //CAMBIADO
(n % 2 == 0) && (n % 3 != 0) i=n/2; // Caso III //CAMBIADO
(n % 2 != 0) && (n % 3 == 0) i=n+2; // Caso IV //CAMBIADO
(n % 2 != 0) && (n % 3 != 0) i=n-1; // Caso V //CAMBIADO


Intentas hacer ifs pero no estas poniendo ningun if... aun asi yo lo sustituiria por ifs anidados y de esta forma evitamos comprobaciones innecesarias.

if (n == 1)
    return 1;
else
{
    if (n % 2 == 0)
        if (n % 3 == 0)
            i=n+5;
        else
            i=n/2;
    else
        if (n % 3 == 0)
            i=n+2;
        else
            i=n-1;
}


Saludos
Título: Re: Función en recursividad
Publicado por: sora_ori en 8 Abril 2014, 23:22 PM
Lo he podido compilar, pero la versión que me ha hecho "NikNitro" no me hace nada!  :-X

(http://oi62.tinypic.com/dhbtqf.jpg)

¿Es correcto lo que me hiciste? Con mi anterior versión me listaba los números.


Saludos
Título: Re: Función en recursividad
Publicado por: leosansan en 9 Abril 2014, 00:34 AM

Hecho de prisa y corriendo, creo que esta es la salida correcta:

Citar
Escribe un numero: 18
18 23 22 11 10 5 4 2 1
Total de llamadas: 9


Process returned 0 (0x0)

Unos pequeños ajustes menores en la declaración de la función:

Código (cpp) [Seleccionar]
void  f2x3 (int n,int i) ;


Lo de la variable i es para ir guardando las llamadas a la función. Y en main:

Código (cpp) [Seleccionar]
scanf("%d", &n);
    f2x3(n,i);


Y para terminar en la función, a lo bruto:

Código (cpp) [Seleccionar]
void  f2x3 (int n,int i) {
    if (n == 1){
      printf ("%d ",n);
      printf("\nTotal de llamadas: %d \n", ++i);
    }
    else
    {
        if (n % 2 == 0 && n % 3 == 0){
          printf ("%d ",n);
          f2x3 (n+5,i+1);
        }
        else if (n % 2 == 0 &&  n % 3 != 0){
              printf ("%d ",n);
              f2x3 (n/2,i+1);
            }
        else if (n % 3 == 0 && n % 2 != 0){
              printf ("%d ",n);
              f2x3 (n+2,i+1);
            }
        else if (n % 2 != 0 &&  n % 3 != 0){
              printf ("%d ",n);
              f2x3 (n-1,i+1);
            }
    }
}


¡¡¡¡ Saluditos! ..... !!!!


(http://st.forocoches.com/foro/images/smilies/aaaaa.gif)
Título: Re: Función en recursividad
Publicado por: noele1995 en 9 Abril 2014, 00:36 AM
No estas llamando a la funcion en el main... normal que no te funcione.

Porcierto numllamadas++ tiene que estar antes de los ifs y no justo antes del ultimo return porque sino hay una llamada que no se contaria....

A mi si que me funciona

Saludos