@nick_10
in effetti un pochino mi ero scoraggiato!
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!