[Programmazione di base] Ricorsione "controvariante" e "co-v

AM91
Buongiorno a tutti,
Sono diversi giorni che cerco inutilmente di capire la differenza tra la ricorsione controvariante e quella co-variante.
Ho un esame a breve e non so come comportarmi, su internet ho trovato poco e niente..

Nei miei appunti purtroppo manca la parte dedicata alla co-varianza, mentre un esempio di ricorsione controvariante che ho trovato è il seguente:

Metodo per la sottrazione
Meno(m, n, n) = m
Meno(m, n, p) = meno(m, n, p+1)+1
E il predicato seguente che lo dimostra:
P (i) = meno(m, n, n-i) = m - i

È possibile esprimere questo metodo con una ricorsione covariante?
Che differenza c'è tra le due e in cosa si differenziano dalla ricorsione di coda?

Ps. Domanda aggiuntiva, a cosa serve il wrapper? Il libro dice "per evitare di innescare il meccanismo di ricorsione quando non è necessario", ma in maniera più semplice cosa significa?

Grazie in anticipo a tutti

Risposte
apatriarca
Da quale libro/dispensa stai studiando questi concetti? Ho visto usare i termini "contravariante" e "covariante" in diversi contesti, ma non li ricordo associati ad un qualche tipo di ricorsione. Stranamente non ho trovato nulla anche facendo una ricerca su internet. Potrebbe insomma essere utile inserire qualche contesto ulteriore, i termini potrebbero non essere standard o forse ho capito male di cosa stiamo esattamente parlando. I due termini hanno origine in teoria delle categorie e si riferiscono normalmente ad un qualche costrutto che preserva o inverte determinate relazioni/mappe.

AM91
Ciao,
innanzitutto grazie per la risposta! Sto studiando dalle dispense del mio professore di Programmazione ma queste sono le uniche pagine dedicate all'argomento, non si parla nemmeno di covarianza, eppure è un concetto legato anche agli array e di sicuro chiederà all'esame di scrivere un programma iterativamente oppure ricorsivamente (covariante/controvariante, dicotomica o di coda)...









La difficoltà per me infatti è proprio capire questi due concetti associati alla ricorsione...una volta capito il meccanismo di ricorsione a cosa mi servono controvarianza e covarianza?

apatriarca
Il fatto che faccia uso di virgolette intorno al termine controvariante e che non dia una definizione appropriata, mostra come il termine non sia effettivamente standard. Credo voglia semplicemente far notare che nonostante normalmente si veda la ricorsione muoversi dal caso N al caso base (0 o 1 per esempio), è possibile anche muoversi in direzione opposta. Ha quindi mostrato esempi di funzioni ricorsive in cui una variabile parte da zero e viene quindi incrementata. La versione covariante è semplicemente quella in cui si va da N a 0..

Il wrapper serve principalmente per astrarre i dettagli dell'implementazione all'utilizzatore della funzione. In effetti il ruolo è normalmente opposto. Si parte da una funzione che si vuole implementare (per esempio meno(x, y)) e si implementa quindi poi una funzione di appoggio (helper function) qualora l'implementazione richiedesse argomenti ulteriori per la ricorsione.

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.