Re: [C] Dubbio esercizio funzione ricorsiva

Messaggioda Raptorista » 13/12/2018, 23:39

La parte nel caso n < 0 è un po' arzigogolata, a occhio sembra che funzioni però. L'hai provato? 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: 5138 di 9616
Iscritto il: 28/09/2008, 19:58

Re: [C] Dubbio esercizio funzione ricorsiva

Messaggioda nick_10 » 13/12/2018, 23:40

Sì funziona!
nick_10
Average Member
Average Member
 
Messaggio: 362 di 754
Iscritto il: 17/11/2016, 16:21

Re: [C] Dubbio esercizio funzione ricorsiva

Messaggioda Raptorista » 13/12/2018, 23:41

E allora va bene. Non sarà il più bel pezzo di codice mai scritto, ma non importa.
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: 5139 di 9616
Iscritto il: 28/09/2008, 19:58

Re: [C] Dubbio esercizio funzione ricorsiva

Messaggioda nick_10 » 13/12/2018, 23:48

Su questo sono d'accordissimo :lol:
Mi scuso per aver fatto perder la pazienza ad entrambi e soprattutto aver scoraggiato @SuperSquirrel :(
nick_10
Average Member
Average Member
 
Messaggio: 363 di 754
Iscritto il: 17/11/2016, 16:21

Re: [C] Dubbio esercizio funzione ricorsiva

Messaggioda Raptorista » 13/12/2018, 23:50

Io non ho perso la pazienza per niente, sono contento se hai capito qualcosa. Il mio pezzo di codice ti è chiaro?
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: 5140 di 9616
Iscritto il: 28/09/2008, 19:58

Re: [C] Dubbio esercizio funzione ricorsiva

Messaggioda nick_10 » 13/12/2018, 23:57

Sisi perfetto. Più che altro è la prima volta che vedo un esercizio fatto cosi

Poi per di più questa discussione mi è stata utilissima per capire a fondo la ricorsione...andavo un po' a caso e senza logica prima.
Grazie ad entrambi
nick_10
Average Member
Average Member
 
Messaggio: 364 di 754
Iscritto il: 17/11/2016, 16:21

Re: [C] Dubbio esercizio funzione ricorsiva

Messaggioda Raptorista » 14/12/2018, 00:05

Bene! Se hai altre domande non esitare a porle!
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: 5141 di 9616
Iscritto il: 28/09/2008, 19:58

Re: [C] Dubbio esercizio funzione ricorsiva

Messaggioda Super Squirrel » 14/12/2018, 13:20

@nick_10
in effetti un pochino mi ero scoraggiato! :-D

Scherzi a parte, mi fa piacere vedere che hai colto il punto, ossia che la cosa fondamentale è avere ben chiara la logica di quello che si sta facendo.
A tal proposito può essere utile analizzare il codice in questione (ho ipotizzato che al solito neg sia una variabile intera inizializzata a 0, anche se in questo caso l'inizializzazione non è obbligatoria):
Codice:
int ric()
{
    int neg = 0;
    int n;
    scanf("%d", &n);
    if(n != 0)
    {
        if(n < 0)
        {
            neg = 1 + ric();
            if(neg % 2 == 0)
            {
                return 0;
            }
            return -1;
        }
        return ric();
    }
    return 0;
}

Vediamo se ho interpretato bene... se tale funzione ritorna 0 allora il prodotto è positivo, altrimenti il prodotto è negativo, giusto?
Innanzitutto concentriamoci sulla variabile neg... dal momento che essa può essere modificata solo dall'assegnazione neg=1+ric(); e poichè la funzione può ritornare 0 o -1, implica che la suddetta variabile può assumere solo i valori 0 e 1. Quindi anche in questo caso la variabile neg non va a contare gli inserimenti negativi così come ti eri prefissato di fare.

Valutiamo ora il corpo di if(n<0):
- ric()=-1 ==> neg=0 ==> (neg%2==0)=true ==> return 0;
- ric()=0 ==> neg=1 ==> (neg%2==0)=false ==> return -1;

Quindi il frammento di codice
Codice:
if(n < 0)
{
    neg = 1 + ric();
    if(neg % 2 == 0)
    {
        return 0;   
    }
    return -1;
}

è perfettamente equivalente a
Codice:
if(n < 0)
{
    return -1-ric();
}

o più semplicemente a
Codice:
if(n < 0)
{
    if(ric() == 0)
    {
        return -1;
    }
    else
    {
        return 0;
    }
}


Riprendiamo ora il codice di @Raptorista. Il frammento
Codice:
if(n < 0)
{
    return !ric();
}

equivale a
Codice:
if(n < 0)
{
    if(ric() == true)
    {
        return false;
    }
    else
    {
        return true;
    }
}


A questo punto noterai che il tuo codice è perfettamente identico a quello di @Raptorista, con l'unica differenza che il tuo per prodotti parziali positivi e negativi ritorna rispettivamente 0 e -1, mentre l'altro 1 e 0.

La logica è quella che ti ho spiegato già in precedenza, e si basa sul fatto che la funzione possa ritornare solo 2 valori, di cui uno associato ad un prodotto parziale positivo ed uno associato ad un prodotto parziale negativo.
Ipotizziamo che questi due valori siano P (che sta per Positivo) e N (che sta per Negativo). Una volta associato all'inserimento nullo il valore "neutro" (ossia per n=0 ==> return P), avremo che il ritorno della funzione passerà da P a N e viceversa ogni volta che la funzione ricorsiva incontra un valore negativo.

Spero di essere stato chiaro e che questo lungo post possa averti aiutato a capire meglio la soluzione di questo esercizio!
Chi dorme in democrazia, si sveglia in dittatura.
Super Squirrel
Senior Member
Senior Member
 
Messaggio: 331 di 1486
Iscritto il: 16/05/2013, 22:05

Re: [C] Dubbio esercizio funzione ricorsiva

Messaggioda nick_10 » 14/12/2018, 16:59

Perfetto! Non so come ringraziarvi. Grazie mille ad entrambi :) :)
nick_10
Average Member
Average Member
 
Messaggio: 369 di 754
Iscritto il: 17/11/2016, 16:21

Precedente

Torna a Informatica

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite