[C] Dubbio esercizio funzione ricorsiva

Messaggioda nick_10 » 11/12/2018, 23:36

Buonasera a tutti!
Ho un dubbio sullo svolgimento di questo esercizio:
"Si scriva in C una funzione ricorsiva che legge in input una sequenza di interi che termina quando viene immesso zero (che non fa parte della sequenza), e restituisce true se il prodotto di tutti gli elementi letti è un intero positivo, altrimenti restituisce false, senza utilizzare la moltiplicazione".
Io ho fatto il seguente codice
Codice:
#include <stdio.h>
typedef enum {false, true} boolean;
boolean ric(){
    int neg=0,m;
    scanf("%d",&m);
    if(m!=0){
        if(m<0) neg=1+ric();
        else neg=ric();
    }
    if((neg%2==0)) return true;
    else return false;
}


La mia idea è quella di contare i numeri negativi che appaiono nella sequenza e poi verificare la sua parità.
Però non funziona :(
nick_10
Junior Member
Junior Member
 
Messaggio: 348 di 377
Iscritto il: 17/11/2016, 17:21

Re: [C] Dubbio esercizio funzione ricorsiva

Messaggioda Raptorista » 12/12/2018, 01:51

Ci sono varie cose che mi sembrano sbagliate o fatte male.
Innanzitutto, o usi vero e falso o usi gli interi. Quello che fai ridefinisce vero e falso come zero e uno [che è quello che sono in pratica, ma non concettualmente] e li usi per fare delle somme, il che è cattiva pratica.
Se vuoi fare le cose con vero e falso, allora usa not neg o !neg per cambiare tra uno e l'altro; se vuoi usare i numeri allora liberati di true e false che fanno solo confusione.
Un'altra cosa che magari non è sbagliata ma che è brutta da vedere è che restituisci sempre 0 o 1 anche se neg è, per esempio, 5 [che in realtà non può mai essere].

Fossi in te pulirei il codice prima di cercare dov'è l'errore, che comunque si vede già da qui.
Un matematico ha scritto:... come mia nonna che vuole da anni il sistema per vincere al lotto e crede che io, in quanto matematico, sia fallito perché non glielo trovo


Immagine
Avatar utente
Raptorista
Moderatore
Moderatore
 
Messaggio: 5133 di 5344
Iscritto il: 28/09/2008, 20:58

Re: [C] Dubbio esercizio funzione ricorsiva

Messaggioda nick_10 » 12/12/2018, 10:00

Interessante la critica al true e false...a lezione abbiam fatto sempre così quando c'è una funzione booleana.
Vedrò di sistemare questa cosa.

Comunque il problema potrebbe essere l'aver inizializzato dalla dichiarazione neg=0?
Forse così è come se ad ogni "giro di ricorsione" azzerassi il tutto
nick_10
Junior Member
Junior Member
 
Messaggio: 349 di 377
Iscritto il: 17/11/2016, 17:21

Re: [C] Dubbio esercizio funzione ricorsiva

Messaggioda Raptorista » 12/12/2018, 12:32

No, il problema è che stai riciclando il caso base per il passo ricorsivo, e lo stai facendo nel modo sbagliato.

Il tuo professore può non essere d'accordo, ma per me 1+boolean è alla stregua di un errore. Poi, siamo tutti d'accordo che funziona, ma anche spezzare i differenziali per risolvere ODE "funziona"...
Un matematico ha scritto:... come mia nonna che vuole da anni il sistema per vincere al lotto e crede che io, in quanto matematico, sia fallito perché non glielo trovo


Immagine
Avatar utente
Raptorista
Moderatore
Moderatore
 
Messaggio: 5134 di 5344
Iscritto il: 28/09/2008, 20:58

Re: [C] Dubbio esercizio funzione ricorsiva

Messaggioda Super Squirrel » 12/12/2018, 15:11

Io farei qualcosa del genere:
Codice:
#include <stdio.h>
#include <stdbool.h>

bool ric()
{
    int n;
    scanf("%d", &n);
    if(n)
    {
        return (n > 0) == ric();
    }
    return true;
}

int main()
{
    if(ric())
    {
        printf("POSITIVO");
    }
    else
    {
        printf("NEGATIVO");
    }
    return 0;
}


Ovviamente al posto della libreria stdbool puoi utilizzare sia un semplice int che un' enum come quella da te definita.
Super Squirrel
Junior Member
Junior Member
 
Messaggio: 325 di 378
Iscritto il: 16/05/2013, 23:05

Re: [C] Dubbio esercizio funzione ricorsiva

Messaggioda nick_10 » 12/12/2018, 15:56

Ho fatto una cosa simile credo:
Codice:
int ric(){
    int neg=0;
    int m;
    scanf("%d",&m);
    if(m!=0){
        if(m<0) neg=1+ric();
        else neg=ric();
    }
    return neg;
}
boolean check(){
    int b;
    b=ric();
    if(b%2==0) return true;
    else return false;
}

Resta il fatto che non capisco dove stava il problema prima...
Ora non mi pare che io abbia cambiato molto; solo il fatto che ho trasportato il controllo della parità all'esterno della ricorsiva
O sbaglio?
nick_10
Junior Member
Junior Member
 
Messaggio: 350 di 377
Iscritto il: 17/11/2016, 17:21

Re: [C] Dubbio esercizio funzione ricorsiva

Messaggioda Super Squirrel » 12/12/2018, 18:54

In realtà non mi sembra tanto simile alla soluzione che ho postato io e inoltre non mi sembra rispetti quella che è la traccia dell'esercizio!

In ogni caso quest'ultimo codice che hai postato funziona perchè la funzione ric() semplicemente ritorna il numero di inserimenti negativi effettuati, mentre la funzione check() controlla se il suddetto valore è pari o dispari.

Per quanto riguarda invece il codice riportato nel post iniziale, magari sarà un mio limite, ma faccio fatica ad individuare una logica precisa... per esempio sei consapevole del fatto che la variabile neg può assumere solo valori compresi nell'intervallo [0;2]?
Super Squirrel
Junior Member
Junior Member
 
Messaggio: 326 di 378
Iscritto il: 16/05/2013, 23:05

Re: [C] Dubbio esercizio funzione ricorsiva

Messaggioda nick_10 » 12/12/2018, 19:23

Sì, ho fatto due funzioni perché in quella non riesco proprio a capire dov'è il problema...ad esempio quello che mi dici tu su valori più grandi di 2 proprio non capisco dove si inceppa :(

Invece così facendo mi son fatto restituire dalla ricorsiva il numero dei negativi inseriti(e in questa mi pare che neg possa assumere valori più grandi di 2), mentre check mi controlla se il totale è pari o dispari
Se è pari allora il risultato del main sarà true dato che il prodotto di tutti gli inseriti sarà positivo, false altrimenti
nick_10
Junior Member
Junior Member
 
Messaggio: 352 di 377
Iscritto il: 17/11/2016, 17:21

Re: [C] Dubbio esercizio funzione ricorsiva

Messaggioda Super Squirrel » 12/12/2018, 20:55

nick_10 ha scritto:ad esempio quello che mi dici tu su valori più grandi di 2 proprio non capisco dove si inceppa :(

All'interno di ogni chiamata ricorsiva la variabile neg vale inizialmente 0 e può essere modificata solo da una delle seguenti assegnazioni:
Codice:
neg = 1 + ric();

Codice:
neg = ric();

e poiché ric() può tornare solo 0 e 1, ecco il motivo per cui il range all'interno del quale può variare neg è [0;2].

Per quanto riguarda il codice che ho postato hai capito qual è la logica?
Super Squirrel
Junior Member
Junior Member
 
Messaggio: 327 di 378
Iscritto il: 16/05/2013, 23:05

Re: [C] Dubbio esercizio funzione ricorsiva

Messaggioda nick_10 » 12/12/2018, 23:16

Quindi il problema nel primo codice è che la funzione ricorsiva ritornava true(1) o false(0)?

Per quanto riguarda il tuo codice non capisco il passaggio if(n) e poi il return (n>0)==ric(). La tua logica credo sia diversa dal contare "i segni meno" della sequenza.
Ma il mio metodo è proprio da buttare? Se volessi fare una funzione ricorsiva che mi conti i negativi e poi controlli che la somma sia pari o dispari?
nick_10
Junior Member
Junior Member
 
Messaggio: 353 di 377
Iscritto il: 17/11/2016, 17:21

Prossimo

Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 6 ospiti