Allora... Prendendone una semplice:
codice:
//queata funzione restituisce il fattoriale di n (=1*2*3*...n-1*n)
int fattoriale(int n)
{
If(n<=1)
    return 1;              //il mio vero punto di uscita
n *= fattoriale(n-1);
return n;
}
Allora entri nella funzione, con ingressi 0 o 1 la funzione torna 1 (perchè così è definito il fattoriale), altrimenti copio n (vedi che non gli passo l'indirizzo, ma lo copio: è importante) e lo moltiplico per il fattoriale del numero che lo precede... In questo modo questa stessa funzione viene richiamata n-1 volte.
ESEMPIO
Se la chiamo per n=3, lui entra ed esegue
codice:
n= 3* fattoriale(2)
, per calcolare fattoriale di due esegue
codice:
n=2*fattoriale(1)
, il fattoriale di 1 torna 1, quindi la prima chiamante in definitiva fa
N=1*2*3.
che è quello che volevamo ottenere.
Allora cosa ha di particolare questa funzione?
In primis ha un punto di uscita (return 1) che dopo un certo numero di chiamate viene SEMPRE raggiunto!
Se così non fosse la funzione continuerebbe a chiamare se stessa in modo infinito!
Dopo questo c'è la vera ricorsione: la runzione richiama se stessa con differenti input.
Infine faccio ritornare il valore calcolato.

Ora pensaci bene ed applica questi concetti alla tua situazione