Quindi il problema nel primo codice è che la funzione ricorsiva ritornava true(1) o false(0)?
Se lo scopo era quello di contare i vari inserimenti negativi, sì, quello era uno dei problemi.
Per quanto riguarda il tuo codice non capisco il passaggio if(n)...
if(n) coincide con if(n!=0). Mi spiego meglio...
Le condizioni delle istruzioni di controllo (if, while, ...) sono delle espressioni logiche e come tali possono assumere solo due valori: vero (1) e falso (0). Il risultato di un'espressione logica è quindi una quantità booleana.
Tornando ad if(n), essendo la condizione costituita da una variabile intera e dovendo essere valutata come un'espressione logica, quello che avviene è un casting implicito da int a bool. Ebbene le regole di casting da int a bool prevedono che 0 coincide con false e tutti gli altri possibili valori (sia positivi che negativi) con true.
...e poi il return (n>0)==ric(). La tua logica credo sia diversa dal contare "i segni meno" della sequenza.
Consideriamo per esempio la sequenza di inserimenti -5 3 -7 0; risolvendo la ricorsione a ritroso avremo che:
- per n=0 la funzione ritorna 1 (poiché l'if viene saltato);
- per n=-7, valutando l'espressione logica (n>0)==ric(), la funzione ritorna 0==1, ossia 0;
- per n=3 la funzione ritorna 1==0, ossia 0;
- per n=-5 la funzione ritorna 0==0, ossia 1.
In pratica una volta incontrato un valore negativo, l'unico modo affinché la funzioni ritorni nuovamente 1 è quello di incontrare un nuovo valore negativo... e quindi in definitiva il risultato della ricorsione sarà 1 soltanto se il numero di inserimenti negativi è multiplo di 2.
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?
Se intendi una funzione del tipo bool ric(void), allora la vedo difficile!