recursividad cruzada

Iniciado por fernaEDLP, 12 Enero 2019, 06:57 AM

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

fernaEDLP

hola nakamas como estan?, espero que bien, necesitaría ayuda, me piden que cree una función recursiva que determine si un numero es positivo o no, es un caso de recursividad cruzada, casi seguro que tengo un error conceptual en mi problema, mi duda està en que en c no puedo  usar public boolean(con false y true), e hice esto, pero obviamente no compila:
y tengo otra, se puede crear una tercer funcion para que solamente llame a esa sola?

   


#include <stdlib.h>
#include <string.h>
int  negativo(int n);
int  positivo(int n);


int main()
{
    int N;
    printf("ingrese el numero\n");
    scanf("%d",&N);
    positivo(N);
    negativo(N);
    return 0;
}

int positivo(int n)
{
    if(n>=0)
    {
        printf("el numero ingresado es positivo");
    }
    else
    {
        return negativo(n);
    }
}
int  negativo(int n)
{
    if(n<0)
    {
        return n;
        printf("el numero ingresado es nevativo");
    }
    else
    {
        return positivo(n);
    }
}

















CalgaryCorpus

- Que valor retorna la funcion positivo si el valor que recibe como parametro es efectivamente positivo?
- Sugiero que las funciones positivo y negativo retornen 1 o 0.
- Sugiero que no hagas ningun printf al interior de esas funciones, sino que sea el main el que lo haga basado en el valor que esas funciones retornen.
Aqui mi perfil en LinkedIn, invitame un cafe aqui

K-YreX

Si pudieras especificar un poco más tu problema... Es decir, ese programa compilar, compila (si le añades la librería <stdio.h> para poder usar <scanf()> y <printf()>). Además puedes quitar <stdlib.h> y <string.h> ya que no estás usándolo para nada en todo el programa.

De todos modos ese programa sigue teniendo errores (aunque ya compila). Si llamas a <positivo(n)> con n positivo, sale el mensaje por pantalla "el numero ingresado es positivo" pero no has hecho ningún <return> (creo que entonces se retorna n pero es mejor especificarlo en el código para que quede explícito).

Si llamas a <negativo(n)> con n negativo, la función retorna n, pero no se mostrará por pantalla "el numero ingresado es nevativo" (creo que querías poner "neGativo" :xD) porque una vez que una función ejecuta un <return> ya sale de la función y no se ejecuta lo que venga después.

Por eso que no se muy bien cual es el fin de esa función, si quieres retornar el mismo número que mandas como parámetro o quieres retornar 1 o 0 como si fuese true o false respectivamente... Y sí, si quieres crear otra función que llame a una de esas puedes hacerlo, pero lo veo un poco absurdo todo esto porque son dos funciones muy sencillas. Algo más funcional sería:

int positivo(int n){
   return (n >= 0);
}

Que devuelve 1 si es positivo y 0 si es negativo. De que sirve crear una función <negativo()> si <negativo() == !positivo()>??

Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

fernaEDLP

Hola gracias a los dos por las respuestas, ajaja si creo que la RAE todavia no modifico el negativo a nevativo, en realidad el enunciado del problema dice cree un algoritmo recursivo que diga si un numero ingresado es negativo o positivo, ya c que suena tonto, pero buscando por internet vi que lo resuelven con recursividad cruzada, pero usan una sentencia que dice public boolean y retornan un true o un false, pero eso estaba resuelto en java

MAFUS

0 es considerado false, diferente a 0 es considerado true.
Pero a partir de C99 hicieron la librería stdbool que sirve para manejar true y false.

fernaEDLP


MAFUS

Me gustó el problema y supongo que ya lo tienes solucionado, así que me he dispuesto a dar solución recursiva a ello. Poco eficiente pero recursiva. Usa una función de interface:

#include  <stdio.h>

int f1(unsigned long n, unsigned long long s) {
    return s==1? n : f1(n>>1, --s);
}

int es_negativo(unsigned long n) {
    return f1(n, sizeof(unsigned long long)*8);
}

int main() {
    printf("%d\n", es_negativo(65536));
    printf("%d\n", es_negativo(-32));
}

fernaEDLP

Mafus gracias,se nota que sabes programar avanzado pero es demasiado eso para mi, ajaajaj, hace de cuenta que le estas enseñando a un cavernicola, porque  usas sizeof?, y que significa --s?

fernaEDLP

tampoco entiendo porque le pasas como parametro n>>1

fernaEDLP

tu codigo para super pro, a mi al final me quedo esto estaria bien?

int  negativo(int n);
int  positivo(int n);


int main()
{
    int N;
    printf("ingrese el numero\n");
    scanf("%d",&N);
    positivo(N);
    negativo(N);

    return 0;
}

int positivo(int n)
{
    if(n>=0)
    {
        return 1;
    }
    else
    {
        printf("el numero es negativo\n");
        return negativo(n);
    }
}
int  negativo(int n)
{
    if(n<0)
    {
        return 0;
    }
    else
    {
        printf("el numero es positivo\n");
        return positivo(n);
    }
}