Una cosa FONDAMENTALE nella definizione di una funzione ricorsiva e' usare una struttura dati RICORSIVA.
Il VETTORE/ARRAY NON E' una struttura dati ricorsiva, ma, ad esempio, lo e' la LISTA, la quale PUO ESSERE IMPLEMENTATA mediante un array, ma anche in n-mila altri modi diversi.
Una lista e' definita RICORSIVAMENTE nel seguente modo:
[] e' una lista (la lista VUOTA)
[a|L] e' una lista composta da un elemento, seguito da una lista
Esempio:
L = [a,b,c] = [a|[b,c]] = [a|[b|[c]]] = [a|[b|[c|[]]]]
Ora ti servono una serie di funzioni per la sua manipolazione
cons(a, L) = [a|L] : aggiungi a alla lista L
first([a|L]) -> a : estrai il primo elemento della lista
rest([a|L]) -> L : ritorni la lista MENO il primo elemento
L = cons(first(L),rest(L))
Esempio:
cons(a,[b,c]) -> [a,b,c]
first([a,b,c]) -> a
rest([a,b,c]) -> [b,c]
first([]) ERRORE
rest([]) ERRORE
Ora ti serve una funzione RICORSIVA per controllare se un elemento e' presente in una lista
contains(a, L):
if L == [] then return false
if a == first(L) then return true
return contains(a, rest(L))
Quindi ti serve una funzione per calcolare la differenza
difference(S, L):
if S == [] then return []
if contains(first(S), L) then return difference(rest(S), L)
return cons(first(S), difference(rest(S), L)
Ora sta a te convertire questo PSEUDOCODICE nell'equivalente C.