Un paio di osservazioni:
1) BRUTTA COSA confrontare double per UGUAGLIANZA. Per problemi di arrotondamento due numeri che SULLA CARTA dovrebbero essere uguali POTREBBERO NON ESSERE UGUALI. Ad esempio uno potrebbe essere 5.000000000000001 e l'altro 4.9999999999999, ma quando li stampi li vedi entrambi scritti come 5.00, MA NON SONO UGUALI.
MOLTO MEGLIO usare degli interi
2) le funzioni RICORSIVE NON HANNO "side-effects", quindi, ad esempio, NON HAI CONTATORI. Questo implica che l'espressione
vettore.dimensione --;
NON E' AMMESSA
3) se modifichi la dimensione del vettore, PERDI L"INFORMAZIONE sulla dimensione dello stesso. Quindi, ad esempio, non puoi passare la struttura "insieme" ad altre funzioni. La struttura "insieme" DESCRIVE l'insieme, quindi, una volta inizializzata NONDEVE ESSERE PIU' TOCCATA a meno che tu modifichi l'insieme stesso
4) due insiemi sono UGUALI INDIPENDENTEMENTE DALL"ORDINE dei suoi elementi. Quindi, ad esempio [1,2,3] E' UGUALE a [3,2,1] E ANCHE A [3,1,2], [2,1,3], ecc.
5) l'idea di controllare se due insiemi hanno lo stesso numero di elementi e' buona: due insiemi con un diverso numero di element NON POSSONO ESSERE UGUALI. MA due insiemi con LO STESSO NUMERO DI ELEMENTI NON SONO necessariamente UGUALI. Infatti [1,2,3] e [4,3,2] hanno entrambi 3 elementi, ma non sono minimamente ugiali.
QUINDI, una volta che ti sei assicurato che i due insiemi hanno lo stesso numero di elementi, devi controllare se gli elementi di un insieme sono presenti nell'altro.
6) la prima funzione RICORSIVA e' una che controlla se un elemento e' presente in un insieme, la seconda e' una che scegli egli elementi di un insieme, la terza che controlla se TUTTI gli elementi di un insieme sono presenti nell'ALTRO insieme.
Come si risolve tutto questo?
La PRIMA COSA e' avere una struttura dati che si presta ad essere devinita in modo ricorsive.
La struttura dati per ECCELLENZA per questo tipo di operazioni e' la lista SEMPLICE.
La definizione RICORSIVA di una LISTA semplice e' la seguente:
1) [] (la lista vuota) e' una LISTA
2) [a| REST]: una lista e' composta da un elemento e da una lista ottenuta rimuovendo il primo elemento
Quindi, se tu hai la LISTA [1,2,3], questa puo' essere smontata nella coppia (1, [2,3]).
La lista [2,3] puo' essere smontata nella coppia (2, [3]).
La lista [3] puo' essere smontata nella coppia (3, [])
La SECONDA COSA e' SAPERE/STUDIARE il PRINCIPIO DI INDUZIONE:
La TERZA COSA e' trovare un modo intelligente per applicare il PRINCIPIO DI INDUZIONE ai tre algoritmi indicati in 6)
Tieni presente che NON DEVI NECESSARIAMENTE implementare una lista. Anche un vettore puo' essere pensato come una lista, usi in modo INTELLIGENTE la tua struttura dati "insieme" piu' un INDICE che usi per indicare dove INIZIA la tua lista. All'inizio la tua lista inizia con il PRIMO elemento del vettore, ma POTREBBE iniziare anche con il secondo, il terzo, ecc ... (questo e' quello che chiamerebbero
spoiler )
LASCIA PERDERE IL CODICE: fino a che non lo sai fare con carat e matita, non riuscirai MAI a scrivere del codice funzionante.