codice:
int conta(int *v, int i, int j, int elem){
    int occorrenze=0;
    if(i==j){
        printf("L'array ha un solo elemento: %d\n", *v);  
    // controlla se v[i] è uguale a elem e se si, incrementa il risultato
    }
    else if(i<j)
    {
        // controlli sia v[i] che v[j]
        //Chiamate ricorsive
    }
    return occorrenze;
}
La funzione ha come scopo quello di ritornare un valore.La stampa la puoi fare ler il debug, ma non confondere le cose.Le stai mischiando.
La parte "contorta" sta nell' effettuare le chiamate ricorsive.
Nel tuo caso ti basta chiamare la stessa funzione, ma passandogli come parametri i+1 e j-1.La chiamata va fatta esattamente come la fai nel main,ma con parametri diversi.
Quindi ad esempio:

codice:
occorrenze+=conta(v,i+1,j-1,elem);
Le chiavi per capire la ricorsione sono capire:
-Quando fermarsi;
-Con che parametri effettuare la (o le) chiamata ricorsiva;