Cerco di spiegartelo nel modo più facile possibile.
La funzione ricorsiva deve essere una sorta di cipolla.Devi essere sicuro che prima o poi l' argomento debba diventare un determinato numero.
Per esempio:
codice:
int power(int base,int exp)
{
if(exp==1)
return base;
else
return base*(base,exp-1);
}
Questa è la classica funzione ricorsiva,per fartela rendere più facile,inizia a calcolarla al contrario,dal cuore della cipolla.
exp può essere un qualsiasi numero,ma alla fine diventerà per forza 1.
Quindi il ritorno è:
codice:
1*power(base,1+1)*power(base,base,2+1)*....*power(base,n);
Attenzione poi che se gli passi un esponente negativo va avanti all' infinito perchè l' esponente non arriva mai a 1.
Prendiamo poi il tuo caso:
codice:
int ricSomma ( int n , int lim)
{
if ( lim == 0 )
return 1 ;
else
return 1+ n * ricSomma ( n , lim - 1 ) ;
}
Se fossi un computer (e sarei lentissimo a fare le cose ) ti dico come farei,ecco un esempio di chiamata:
La eseguo su un pezzo di carta,siccome lim è 3,per ora scrivo 1+3*ricSomma(3,2).
Poi faccio :
lim è ancora diverso da 0,per cui al risultato aggiungo 1+3*ricSomma(3,1).
Stavolta lim è uguale a 1,infatti il principio della funzione ricorsiva è che prima o poi ritornerà un valore fisso,per cui aggiungo come risultato 1.
Adesso so che ricSomma(3,3)=1+3*ricSomma(3,2);
ricSomma(3,2)=1+3*ricSomma(3,1);
ricSomma(1,1)=1.
Allora sostituisco:
codice:
result=1+3*(1+3*(1+3*(1)));
Il cuore della cipolla è sempre uno,parto da la a fare i conti.
Il risultato viene 40,ma ci si mette sempre troppo tempo.
Per fare l' algoritmo devi sapere il caso generale,in questo caso non viene proprio una somma ricorsiva.
Fai finta che sei tu che devi fare i conti,per fare 1+2 se non sai quanto è 2 fai 1+(1+1) e così via.
Ad esempio per la somma ricorsiva fai 2+(2-1),col presupposto che quando arrivi a 1 ti fermi.