[C] Dubbio esercizio funzione ricorsiva
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
La mia idea è quella di contare i numeri negativi che appaiono nella sequenza e poi verificare la sua parità.
Però non funziona
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
#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
Risposte
Sì funziona!
E allora va bene. Non sarà il più bel pezzo di codice mai scritto, ma non importa.
Su questo sono d'accordissimo
Mi scuso per aver fatto perder la pazienza ad entrambi e soprattutto aver scoraggiato @SuperSquirrel
Mi scuso per aver fatto perder la pazienza ad entrambi e soprattutto aver scoraggiato @SuperSquirrel
Io non ho perso la pazienza per niente, sono contento se hai capito qualcosa. Il mio pezzo di codice ti è chiaro?
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
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
Bene! Se hai altre domande non esitare a porle!
@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):
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
è perfettamente equivalente a
o più semplicemente a
Riprendiamo ora il codice di @Raptorista. Il frammento
equivale a
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!
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):
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
if(n < 0)
{
neg = 1 + ric();
if(neg % 2 == 0)
{
return 0;
}
return -1;
}è perfettamente equivalente a
if(n < 0)
{
return -1-ric();
}o più semplicemente a
if(n < 0)
{
if(ric() == 0)
{
return -1;
}
else
{
return 0;
}
}Riprendiamo ora il codice di @Raptorista. Il frammento
if(n < 0)
{
return !ric();
}equivale a
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!
Perfetto! Non so come ringraziarvi. Grazie mille ad entrambi