Sei sulla pagina 1di 22

Corso online 2 CFU

INFORMATICA E METODO COMPUTAZIONALE

Algoritmi e definizione
Nella vita quotidiana si sente parlare di algoritmi sia:
- In contesti positivi come la ricerca rapida di informazioni in una grande mole di dati
oppure riconoscimento e manipolazione di immagini
- In contesti negativi quindi l’osservazione dei nostri comportamenti sui social network

Un algoritmo viene associato a un calcolo, programma o app del computer e un sistema


informatico ma non sono sufficienti per definire un algoritmo.
- Pezzi = Dati in ingresso o input
- Progetto = processo da eseguire ossia algoritmo
- Risultato = uscita / output

Definizione: Un algoritmo è un insieme di istruzioni ordinate, non ambigue ed effettivamente


eseguibili, seguendo le quali per ogni ingresso di tipo appropriato si ottiene un’uscita in un
numero finito di passi.

1. Rappresentazione dell’ingresso
L’ingresso deve essere finito e possedere una struttura identificabile. Deve essere fissato
nel modo in cui i dati in ingresso vengono rappresentati.
2. Modello di calcolo
Le istruzioni devono essere chiare, Fare riferimento ad un insieme finito e fissato delle
operazioni di base che formano il modello.Le operazioni di base e la descrizione del loro
effetto sono il modello

3. Codifica
La sua descrizione precisa che fa uso dei linguaggi di programmazione
4. Terminazione
Per ogni ingresso l’esecuzione dell’algoritmo deve avvenire in un numero finito di passi cioè
dopo avere eseguito un numero finito di istruzioni elementari

Problemi algoritmici
Un algoritmo non è una qualunque procedura bensì è una strategia per risolvere un
problema ben definito e bisogna esigere risposte corrette per ingressi appropriati.

Diciamo che un problema computazionale( specifica di input e output) è preciso quando:


- L’insieme degli input accettabili
- L’insieme degli output sono corretti in base agli input

Un caso particolare di input si dice istanza del problema = un algoritmo risolvere un


problema algoritmico se produce un'uscita corretta per ogni istanza ammissibile.

Esempi di problemi.
● Sorting / ordinamento ordinare una lista di elementi secondo un dato criterio.
( si può risolvere con soluzione quadratiche) TRATTABILE

● Torre di Hanoi è un rompicapo in cui si chiede di spostare una torre i dischi secondo
certe regole( spazio e tempo infinito) NON TRATTABILE

● Ciclo di Hamilton Ossia la domanda se esista un percorso in una rete se attraversa i


nodi esattamente una volta ( Problemi chiamati “NP completi” dei quali sappiamo
riconoscere la correttezza di un'uscita in modo efficiente) NON SAPPIAMO
RISPONDERE

● Ricoprimento o tassellatura di una superficie mediante piastrelle.( non è risolubile


ritmicamente) NON TRATTABILE

Dato un problema algoritmico se esiste una soluzione( ossia un algoritmo che lo risolve)
allora è facile convincersi che ne esistono infinite altre.
Tuttavia esistono soluzioni diverse allo stesso problema:
- Non tutti i problemi algoritmici non sono tutti risolvibili o trattabili e ci sarà sempre
un'istanza del problema che non sarà terminabile

Gli algoritmi possono differire per efficienza, ossia per il tempo e lo spazio che richiedono in
funzione degli ingressi.

1. Soluzioni efficienti
2. Non trattabili
3. Problemi che impiegano un ritmo infinito
4. Problemi non trattabili

Indici e dizionari
Dopo il calcolo numerico, una delle prime applicazioni dei computer è stata l’archiviazione
dei dati, tutt’oggi di importanza fondamentale sia di per sé, sia come parte di altri sistemi
★ Dalle applicazioni gestionali ai servizi finanziari, dalle anagrafiche alle rubriche
telefoniche personali, ma anche ad esempio alla base dei sistemi web per la
gestione e condivisione di contenuti ed i social network.

All’origine di tutto vi è un’idea familiare: quella del dizionario. Un dizionario non è altro che
una lista di unità di informazione = record, ciascuna delle quali suddivisa in campi, ossia
porzioni individuate da un’etichetta.

Tra di essi vi sono uno o più campi chiave, così detti perché il contenuto o valore delle chiavi
è sufficiente ad individuare una singola unità, distinguendola dalle altre.

Naturalmente la funzione di un dizionario non è solo quella di contenere informazioni, ma


anche e soprattutto quella di renderle disponibili rapidamente.
● Sappiamo per esperienza che cercare un oggetto in una collezione ordinata secondo
un criterio è più facile e veloce che farlo in un insieme disordinato e caotico.

Ma che si fa se vogliamo ordinare la stessa lista in base a due o più campi chiave
diversi?
Immaginiamo di avere una lista di libri,
- ciascuno dei quali sia registrato con cognome dell’autore, titolo ed altre informazioni
come l’edizione, la collocazione, eccetera.
Per semplicità supponiamo che non vi siano più di un libro per autore (tra i cui cognomi non
vi devono essere omonimie) né due libri con lo stesso titolo,
- In modo che i campi “autore” e “titolo” siano ciascuno una chiave 1 .

La lista, alla quale abbiamo aggiunto un numero progressivo per la posizione dei suoi
record, potrebbe essere:
Vorremmo ordinare la lista sia per autore che per nome, ma senza duplicarla. Per questo si
può ricorrere all’idea di costruire un indice per ciascun criterio di ordinamento, che associ ad
ogni valore cercato la posizione nell’elenco completo dei libri.

Raffigurando sia la lista che gli indici con delle tabelle, otteniamo la figura

Ciascun indice è una nuova lista; ogni record contiene un campo per la chiave su cui
intendiamo fare ricerca, i cui valori sono ordinati alfabeticamente.

Vi è poi un secondo campo il cui valore è la posizione del record relativo nella lista
originaria. Nella figura la posizione è sostituita da frecce, che sono dei link ai record della
lista dei libri.
L’organizzazione della lista dei libri e quella degli indici sono esempi di ciò che in informatica
si chiama una struttura dati.
- Si intuisce che la scelta delle strutture dati con cui rappresentare le informazioni da
elaborare influisce sugli algoritmi con cui le informazioni vengono elaborate.

Nel caso dell’esempio, anziché scandire la lista dei libri alla ricerca di un autore oppure di un
titolo, possiamo utilizzare il metodo della ricerca dicotomica sugli indici, consistente nel
partire dal record che nell’indice occupa il posto medio, confrontare il valore della chiave
dell'indice con quello cercato e, se questi coincidono, seguire il link alla lista dei libri per
estrarne le informazioni desiderate; altrimenti, in base al confronto possiamo dedurre se la
chiave cercata venga prima o dopo quella in posizione intermedia, cosicché potremo
confinare la ricerca a circa la metà dell’indice, dove continueremo utilizzando lo stesso
metodo.
- Se la lista dovesse essere solo consultata, senza che venga aggiornata con
l’aggiunta o l’eliminazione di nuovi libri, gli indici possono essere delle semplici liste
come quelle in figura.
- Ma se fossero necessari inserimenti ed eliminazioni, magari anche frequenti, la
soluzione adottata sarebbe tutt’altro che efficace.
- Infatti ad ogni aggiunta o eliminazione di un libro dalla lista saremmo costretti a
riordinare entrambi gli indici.

Tra le tecniche adottate per risolvere il problema di gestire indici su grandi masse di dati e
che possono essere aggiornati una delle più usate si basa sull’idea di dotare gli indici di
una struttura gerarchica detta albero 2 , in modo tale che un indice sia una gerarchia di
indici come in figura, in cui le chiavi sono rappresentate da semplici numeri:

Ciascun riquadro, detto nodo, è un indice nel senso del nostro primo esempio nel senso che
è ordinato ed ha una lunghezza fissata, in genere non molto grande.

La differenza è che ora la sequenza delle chiavi, rappresentata orizzontalmente in figura,


contiene tra una chiave e l’altra un link ad un altro nodo, oppure è vuoto come nel caso dei
nodi della seconda riga.

Osservando i riquadri in basso cui puntano i link a sinistra e a destra della chiave “3” in
quello in alto si può osservare come i valori delle chiavi siano tutti minori di 3 nel primo nodo,
e maggiori di 3 nel secondo.
- Lo stesso vale per le chiavi “30” e “60” rispetto alle chiavi presenti nei nodi cui
puntano i link che le circondano.

La ricerca su questa struttura è simile alla ricerca dicotomica. Si comincia dal nodo più in
alto, detto radice dell’albero, che fa le veci del punto medio; se il valore cercato, diciamo 6,
non è presente nella radice, la ricerca individua l’intervallo 3, 30 in cui si trova il valore 6,
proseguendo la ricerca nella struttura cui si riferisce il link tra le chiavi “3” e “30”.

Per apprezzare il vantaggio di avere una struttura così complicata consideriamo la


rappresentazione della sequenza 1, 2, 3:

Nella figura le frecce rappresentano i link, il pallino nero un link vuoto, il trattino uno spazio
libero per una chiave. Se a questo indice aggiungiamo la chiave “4” possiamo farlo nel
riquadro in cui si trova “3”, dato che il posto c’è:
Se ora però aggiungiamo la chiave “5” non c’è posto a destra di 4. Abbiamo allora due
possibilità: o aggiungiamo il “5” a destra di 2 nella radice, oppure utilizziamo il terzo link
presente in radice per aggiungere un nuovo nodo, copiando il 4 a destra del 2 come
illustrato in figura:

In ogni caso la struttura ottenuta dopo l’inserimento ha le stesse caratteristiche di quella


precedente, è cioè sempre un B albero.

Dov’è il vantaggio di usare un B-albero rispetto ad un indice lineare come una


semplice lista?
Quando si inserisce una chiave in un indice lineare si è costretti a scalare tutti quelli che
seguono o precedono per mantenere l’ordine, dunque l’inserimento ha costo lineare nel
numero delle chiavi; al contrario in un B-albero tutte le modifiche si svolgono lungo un ramo,
cioè lungo un cammino dalla radice ad un nodo senza discendenti, detto foglia.

Ora, come mostra anche il nostro piccolo esempio, in un B-albero la lunghezza di un ramo è
la stessa, non importa quale percorso scegliamo dalla radice ad una foglia. Con l’aiuto di un
po’ di matematica si trova che tale lunghezza è logaritmica nel numero delle chiavi, cioè
cresce molto più lentamente di quella lineare del tempo necessario all’inserimento in un
indice lineare.

Pescare pagine nell’oceano del web


In questa lezione tratteremo:
• di come dalle numerosissime pagine del web vengano estratte informazioni utili per la
ricerca e come queste vengano organizzate mediante indici;
• dell’uso che si fa delle interrogazioni ossia dell’input degli utenti;
• di come sia possibile valutare le pagine trovate presentandole in ordine di pertinenza;
• di come si sfruttino altre informazioni sul contesto in cui le parole chiave sono state trovate.

Sin dal suo nascere nei primi anni ‘90 il Web ha costituito una sfida per sviluppatori e utenti.
L’abbondanza di informazioni infatti può essere un ostacolo se non si dispone di uno
strumento efficiente di ricerca.
Simmetricamente il problema di farsi trovare, sia da parte dei fornitori di contenuti che dei siti
commerciali, ha spinto la nascita di nuovi sistemi oggi familiari, i motori di ricerca.
Non bisogna però dimenticare che i motori di ricerca si basano su sofisticati algoritmi per la
ricerca, la catalogazione e l’ordinamento dei risultati della ricerca cercando di indovinare
cosa possa essere più o meno rilevante in rapporto alle richieste degli utilizzatori.
Ma come fa il motore di ricerca a trovare così rapidamente le risposte? L’elaborazione della
risposta di un motore di ricerca attraversa tre fasi:
1. Il motore riceve la nostra stringa di parole, detta interrogazione;
2. Usando le parole come parole chiave cerca pagine corrispondenti nel web (matching);
3. Infine le ordina in modo che le più pertinenti precedano quelle che lo sono meno.Ranking

Tuttavia già la prima fase sembra presentare problemi insormontabili: dato il numero
astronomico di pagine che formano il web che si calcola abbia superato i 4 miliardi già nel
2016.

Essendo impossibile visitare miliardi di pagine nel momento dell’interrogazione bisogna


prepararsi in anticipo; perciò programmi esploratori della rete detti crawler (nuotatori) o
spider (ragni) scandagliano periodicamente il web navigando da una pagina all’altra,
riferimenti e brevi brani vengono raccolti in grandi basi di dati, quindi si costruiscono degli
indici in linea di principio simili all’indice analitico di un saggio

La costruzione di indici è infatti essenziale per velocizzare la risposta ad un’interrogazione,


Come distinguere nella massa delle risposte quelle pertinenti?
- Per valutare l’interesse di un testo un essere umano non si limita a cercarvi le parole,
bensì le interpreta nel contesto in cui si trovano.

Ma un algoritmo o un programma per computer come può interpretare il


contesto senza capirlo?
In realtà gli indici di cui abbiamo parlato sono più complessi di un indice analitico, non solo
perché con l’indirizzo della pagina si memorizza anche una porzione del testo estratto dalla
pagina, ma perché vengono ricordate anche altre informazioni come la posizione di ciascuna
parola.

Oltre alle occorrenze e alle posizioni delle parole chiave, gli algoritmi di ordinamento
sfruttano anche altre informazioni dal contesto;
- ad esempio una pagina è considerata più rilevante se una o più parola chiave
occorre nel titolo, piuttosto che nel corpo della pagina.

Queste informazioni si possono scoprire utilizzando ancora una volta la posizione delle
parole nella pagina, questa volta rispetto ai marcatori HTML, cioè a quelle parole invisibili
nella pagina così come normalmente mostrata da un browser, ma presenti nel codice della
pagina, che delimitano porzioni di una pagina web definendone formato e funzione.

In conclusione:
• Abbiamo visto come i motori di ricerca si basino su di una sofisticazione della vecchia idea
di ordinare le parole di un testo in un indice analitico. La velocità con cui questi indici
possono essere consultati dipende da algoritmi e strutture dati impiegati in molti campi
dell’informatica e in particolare nelle basi di dati.

• La memorizzazione di informazioni più strutturate della semplice occorrenza di parole e la


riduzione del concetto di appropriatezza a quello di distanza in una pagina è una tecnica
ampiamente utilizzata anche in altri contesti dell’intelligenza artificiale, dove occorre
misurare la rilevanza o l’interesse di un’informazione senza comprenderla.

• Esistono altri trucchi per migliorare l’accuratezza delle risposte di un motore di ricerca,
alcuni dei quali basati sulle informazioni meta-linguistiche presenti nel codice html delle
pagine.

In questa esposizione ci si è limitati agli aspetti interni alla singola pagina per misurarne la
congruità rispetto alle richieste.

PageRank, ossia del metodo utilizzato dai motori di ricerca per valutare l’importanza
relativa delle pagine web. Parleremo:
• dell’idea di contare quanti link conducono ad una pagina;
• di come tener conto dell’autorevolezza delle pagine che contengono questi link;
• del problema del calcolo del PageRank in presenza di cicli;
• del metodo utilizzato per conciliare il principio del numero dei link con quello
dell’autorevolezza anche in presenza di cicli detto del navigatore casuale;

1) Come fare per stimare l’importanza di una pagina ?


All’inizio degli anni ‘90 AltaVista aveva implementato i migliori algoritmi per stabilire le
corrispondenze tra pagine ed interrogazioni, ma il metodo introdotto da Brin e Page per
calcolare l’importanza delle pagine ha fatto di Google il motore di ricerca di gran lunga più
popolare.
- Il cuore del metodo di Google è l’algoritmo PageRank per il calcolo dell’importanza di
una pagina presente sul Web.

2) L’algoritmo mira a misurare la popolarità di una pagina considerando il numero di


“citazioni” ossia di link che portano alla pagina.
- Per confrontare l’importanza di due pagine che riportano ricette per la torta di mele,
contiamo il numero di pagine che contengono link verso l’una e l’altra.

D’altra parte non tutti i link verso una pagina hanno lo stesso valore.
- Riprendendo l’esempio delle pagine sulla torta di mele, se una pagina sulle torte è
linkata da quella di un amico o di un semplice simpatizzante l’apporto di questo voto
è minore di quello che proviene da un noto sito di cucina, con molti link verso di sé.

Riassumendo il PageRank della pagina P dipende da:


• il numero delle “citazioni” ossia dei link verso P, detti backlink di P;
• l’autorevolezza ossia il PageRank delle pagine Q che contengono i backlink di P;
• il numero di link in ciascuna pagina Q;

In forma semplificata potremmo descrivere il PageRank di P come la somma dei rapporti tra
i PageRank delle pagine contenenti i backlink di P ed il numero di link che esse contengono

Valutando così numero, importanza ed apporto di ciascuna pagina all’importanza di P.

3) CICLO:
La formula del PageRank tuttavia non è facile da calcolare.
Infatti, poiché il PageRank di una pagina dipende da quello di altre, il modo più naturale per
calcolarlo è navigare lungo i link da una pagina all’altra.

Ma cosa succede se, come nell’esempio il grafo delle pagine e dei link
contiene uno o più cicli, ossia la navigazione può tornare su una pagina già
visitata?
1. Attribuiamo 1 come PageRank di partenza a ciascuna pagina
2. Quindi sommiamo il PageRank di ciascuna pagina che ha un link verso quella da valutare
(trascurando per semplicità il numero di link che questa contiene);

3. Dato che quest’ultima operazione ha alterato il PageRank delle pagine A, B che


contengono ciascuna un link verso C, il PageRank di C deve essere ricalcolato.

Ma allora anche quello di A linkata da C sarà ricalcolato, e dunque quello di B e poi quello di
C, e così via all’infinito.

Per evitare questo circolo vizioso l’algoritmo ricorre ad un trucco:


Immaginiamo di osservare il comportamento di un navigatore il quale sceglie una pagina P a
caso da cui iniziare la sua navigazione; quindi sceglie, anche qui a caso, un link in P diciamo
verso Q, con una probabilità prefissata continua la navigazione da Q oppure sceglie una
pagina a caso R e riparti da R.
Iterando un numero sufficiente di volte la procedura e ricalcolando il PageRank sulla base di
ogni iterazione, i valori delle pagine visitate si stabilizzano, dandoci così una stima della loro
importanza.

Aggiungiamo in conclusione qualche osservazione:


• la formula del PageRank e l’algoritmo che ne calcolo il valore sono un’applicazione
originale di tecniche statistiche note che garantiscono la stabilizzazione del calcolo se
ripetuto un congruo numero di volte;

• Il metodo del navigatore casuale riesce a conciliare:


- Le idee basate sul numero delle citazioni
- sulla loro autorevolezza
- con la presenza eventuale di cicli nella navigazione tra le pagine;

• L’obiezione che le sole citazioni non siano sufficienti per valutare l’importanza di una
pagina non trova riscontro nell’esperienza, sempre a patto di accettare l’equazione tra
importanza e popolarità;

• Esistono tecniche per alterare il PageRank di una pagina moltiplicando fraudolentemente i


suoi backlink ovvero aggiungendo alla formula parametri per promuovere pagine e siti a
scopo commerciale; in ogni caso nelle realizzazioni oggi in uso dell’algoritmo di Brin e Page
si tiene conto di altri fattori oltre la popolarità.

Dalle mappe al pagerank


I grafi sono strutture matematiche di apparente semplicità, ma di grande versatilità nel
rappresentare situazioni ed informazioni di ogni genere; qui ci interessano perché sono un
modello naturale di problemi in cui si tratta di mappe e percorsi, e quindi anche di quella
mappa invisibile che costituisce la ragnatela planetaria del web.
Un grafo/ grafico è una coppia G = (Vertici, Edges) di due insiemi, i vertici e gli archi
(edges in Inglese).
- I vertici sono punti cui di solito si associa un’etichetta( numero, stazioni);
- gli archi sono coppie di vertici (u, v) che indicano la direzione del flusso ,
rappresentati con frecce o segmenti a seconda che l’ordine, ossia il verso, sia
rilevante o meno.

Ad esempio:

Quello in figura è un grafo orientato perché gli archi hanno un verso. Si possono osservare
alcuni percorsi tra vertici, concatenando le frecce secondo il loro verso:
- ad esempio dal vertice 4 si può raggiungere il vertice 1 attraversando un solo arco,
ma anche il 4 si raggiunge dall’1, passando per il 2 da cui si raggiunge il 4
attraversando un singolo arco; oppure, dopo aver raggiunto il 2 dall’1, si può
proseguire passando per il 5; ancora potremmo soffermarci sul 2 un numero
qualunque di volte percorrendo l’arco che esce da quel vertice e vi rientra.

Un grafo può avere diverse caratteristiche.


Nell’esempio se si raggruppano i vertici in base alla raggiungibilità gli uni dagli altri si
ottengono il gruppo 1, 2, 4, e 5 da una parte e 3, 6 dall’altra che formano le due parti
connesse del grafo.

La prima parte poi è connessa in un senso più stretto della seconda, dato che qualunque
vertice è raggiungibile da qualunque altro, sia pure non direttamente: di conseguenza in
questa parte esistono vari percorsi ciclici, o semplicemente cicli; al contrario possiamo
andare solo da 6 a 3 nella seconda parte, che infatti è connessa in un senso più debole.

Queste caratteristiche, ed altre ancora come


● l’esistenza di un percorso o cammino tra due vertici,
● la distanza tra due vertici intesa come il minimo numero di archi che formano un
cammino tra due vertici ove esista
● , le parti connesse,
● la presenza o assenza di cicli ed altro ancora,
Si possono scoprire mediante algoritmi detti di visita del grafo.

Le due visite fondamentali, da cui pressoché tutte le altre derivano, sono la visita in
ampiezza e quella in profondità.
Nel caso di una visita in ampiezza si parte da un vertice v, quindi si visitano i vertici
raggiungibili da v attraversando un arco, detti adiacenti di v, poi gli adiacenti degli adiacenti
di v e così via, avendo cura di marcare i vertici visitati per non confinare la visita in un
eventuale ciclo.
Le prime fasi della visita del grafo non orientato

a partire dal vertice A sono illustrate nelle figure seguenti:

Dove i vertici sono colorati di bianco prima di essere visitati


In grigio al momento della visita
in nero quando tutti i loro adiacenti sono stati visitati.

Si può immaginare che la visita in ampiezza consista nella propagazione di un’onda, che
viaggia in tutte le direzioni alla stessa velocità; non a caso questo genere di visita risolve sia
il problema della raggiungibilità, che quelli del calcolo delle distanze e del percorso minimo
tra due coppie di vertici,
- utile ad esempio quando il grafo rappresenta una mappa ed i vertici le località di
partenza ed arrivo nonché le tappe intermedie.

La visita in profondità invece, si basa sull’idea di scegliere ogni volta un adiacente non
visitato dell’ultimo vertice visitato, e questo finché ve ne siano; quando tutti gli adiacenti di un
vertice u siano stati visitati, u viene colorato di nero e si torna indietro per vedere se il vetrice
v da cui avevamo raggiunto u, abbia o meno dei vertici adiacenti ancora da visitare:
Nelle figure qui sopra la visita in profondità, iniziata dal vertice A, raggiunge il vertice H da E
(prima figura), che non avendo altri adiacenti che non siano stati visitati viene colorato di
nero (seconda figura), e lo stesso accade con il vertice E (terza figura); a questo punto la
visita torna sul vertice F, scoprendo G nella fase immediatamente successiva.

Si noti la differenza con la visita in ampiezza a partire dallo stesso vertice A, la quale scopre
e visita sia B che e subito dopo A, essendo entrambi adiacenti di A.

Benché non sia esattamente così, il calcolo del PageRank è concettualmente una visita in
profondità del grafo del web, in cui i vertici sono le pagine e gli archi sono i link da una
pagina all’altra.
La scelta del prossimo vertice da visitare avviene in modo casuale, ma la decisione di
tornare indietro non avviene per mancanza di ulteriori pagine cui accedere e non è
necessariamente verso l’ultima pagina visitata.

Poiché ogni relazione binaria, cioè tra coppie di entità, si può rappresentare e con un grafo,
non sorprende che algoritmi che sono varianti più o meno sofisticate di quelli di visita siano
utilizzati nei campi più disparati.

- Un esempio suggestivo è lo studio dei gruppi degli aderenti ad un social-network


rispetto alle loro amicizie, preferenze ed altro.

Ricorsione
Struttura ricorsiva di un problema
In questa lezione parleremo di come risolvere un problema vedendolo in due modi diversi,
confronteremo quello che accade in questi casi con un esempio di illusione ottica e useremo
queste considerazioni per spiegare che cosa significa risolvere un problema in modo
ricorsivo.

Un aspetto importante della soluzione di problemi è la possibilità di vedere uno stesso


problema in modi diversi, ciascuno di questi può suggerire un approccio diverso alla sua
soluzione.
- Questo è analogo ai fenomeni percettivi studiati in psicologia.
★ In questo esempio, la stessa figura può essere vista in due modi diversi:
1) Come il ritratto di una giovane
2) Come quello di una vecchia signora.

Ritorniamo ora alla soluzione di problemi Immaginiamo di avere un rettangolo di b= n e di


H= m, dove per semplicità n ed m prendono valori interi. L’Area= m*n quadretti.
All’interno di questo disegno possiamo mettere in evidenza la prima colonna, che consiste di
m quadretti; se noi la stacchiamo, otteniamo due figure: una colonna di area m, e un
rettangolo, di nuovo, di altezza m questa volta però di base n-1.
Il fatto che il numero di quadretti non sia cambiato nelle due figure ci permette di concludere
che il prodotto di m*n ammette una riformulazione cioè coincide con il prodotto di m(n-1) a
cui sommiamo ancora n, e questo si può leggere come parte di una definizione ricorsiva
della moltiplicazione di interi positivi.

Lo stesso rettangolo è alla base della dimostrazione geometrica di un altro fatto aritmetico
elementare. Supponiamo che n, la base del rettangolo nella figura, si possa vedere come la
somma di due interi p e q; allora l’area del rettangolo è data dal prodotto di m(p+q)
Possiamo mettere in evidenza all’interno del rettangolo due rettangoli più piccoli di altezza m
e di basi rispettive p e q. Separiamo questi rettangoli Il numero di quadretti non è cambiato,
questo dimostra che vale la proprietà distributiva: il prodotto di m(p + q) coincide con il
prodotto di (m*p)+ (m*q), questo è consentito dal fatto che abbiamo potuto vedere la stessa
figura in due modi diversi.

Guardiamo ora il disegno schematico di una sequenza di elementi. Siamo interessati a


inventare un procedimento per misurarne la lunghezza. Per fare questo potremmo contare i
quadratini che rappresentano gli elementi, partendo per esempio da quello più a sinistra.
Però, anche in questo caso potremmo vedere il problema in modo diverso, e interpretare lo
stesso disegno come un elemento, quello in grigio seguito da un’altra sequenza, più corta di
una unità rispetto alla precedente. La lunghezza dell’intera sequenza ammette allora una
formula ricorsiva, la lunghezza della sequenza complessiva è la lunghezza della sequenza
senza il primo elemento a cui sommiamo un’unità.

La ricorsione si può mettere in evidenza osservando che il nome della funzione lunghezza
compare da entrambi i lati dell'equazione. Per avere una definizione ricorsiva completa
basta aggiungere che la sequenza priva di elementi, la sequenza vuota, ha 0 elementi.

La formula ci permette di calcolare (ricorsivamente) la lunghezza di qualsiasi sequenza


finita. Per esempio la lunghezza n1 di questa sequenza è data alla somma di 1 più la
lunghezza n2 della sequenza che risulta separando il primo elemento dai rimanenti
continuando in questo modo otteniamo via via sequenze rimanenti più corte e arriviamo al
termine del procedimento ricorsivo quando si deve calcolare la lunghezza della sequenza
vuota, che come abbiamo detto è 0. Questo ci dà il valore finale per la lunghezza dell’intera
sequenza, in questo caso 4.

La torre di Hanoi
In questa lezione parleremo della soluzione ricorsiva al problema della Torre di Hanoi,
indicheremo la traccia del procedimento seguito nella soluzione, ne vedremo la natura
ricorsiva e infine ne estrarremo il programma.

Il problema della torre di Hanoi è un rompicapo di matematica ricreativa inventato dal


matematico francese Edouard Lucas alla fine dell’800.
Perché ci interessa questo problema di matematica ricreativa?
Dal punto di vista della ricorsione questo è un bell'esempio di come un problema non
numerico possa essere risolto in modo ricorsivo.

Nell’esempio che consideriamo, che è una versione semplificata del problema originale, i
dati del problema consistono di tre pioli:
- A
- B
- C
Di tre dischi concentrici, sovrapposti in ordine decrescente di diametro sul piolo A.
Obiettivo del rompicapo: spostare la torre di Hanoi dal piolo A al piolo C muovendo un disco
alla volta da un piolo a un altro e non sovrapponendo mai a un disco un altro disco di
diametro maggiore.

Vediamo come procedere in questo esempio.


Il disco piccolo dal piolo A viene mosso verso il piolo C
Il disco medio dal piolo A passa al piolo B
Il disco piccolo dal piolo C passa al piolo B
Il disco grande, A, la base della Torre passa al piolo C, dove assume la sua posizione
definitiva.
Il disco piccolo passa dal piolo B al piolo A
Il disco medio passa dal piolo B al piolo C
Infine, il disco piccolo passa dal piolo A al piolo C

Osserviamo che il disco che viene spostato a ciascuna mossa è completamente identificato
dal piolo su cui si trova all’inizio della mossa.
● Se una mossa= una freccia interposta tra il nome del piolo da cui parte il disco e il
nome del piolo a cui arriva, la traccia del procedimento che abbiamo seguito è
questo elenco di 7 mosse. L’elenco non dà alcuna struttura al procedimento.

Ora però isoliamo al suo interno due parti:


1. La prima consiste delle prime 3 mosse,
2. La seconda delle ultime tre.
3. La prima parte del procedimento sposta la torre di 2 dischi dal piolo A al piolo B
usando il piolo C come supporto; la seconda sposta la torre di 2 dischi dal piolo B al
piolo C usando il piolo A come supporto.

Vediamo così il problema della torre di Hanoi per 3 dischi in modo ricorsivo: riduciamo il
problema di spostare la torre di 3 dischi da A a C usando B come supporto ad uno più
semplice relativo allo spostamento di una torre di 2 dischi.
La mossa che sposta il disco più grande da A a C si può vedere come il punto di arrivo di
questo regresso: sappiamo infatti come spostare una torre che consiste di un solo disco.

Vedere questo problema ricorsivamente significa allora vedere una Torre di un numero
arbitrario n di dischi, maggiore di 1, come formata da una base, il disco più grande, a cui è
sovrapposta una Torre di Hanoi di n – 1 dischi.

Infine, possiamo usare questa idea per progettare un procedimento ricorsivo per la
soluzione del problema generale della Torre di Hanoi a n dischi, in cui abbiamo anche
informazioni sui ruoli giocati dai tre pioli nelle varie fasi del procedimento:
•punto di partenza,
•punto di arrivo del movimento
•Piolo di appoggio.
Nella formulazione originale del problema, il suo inventore aveva finto che il problema fosse
una semplificazione di una Torre di Hanoi di 64 dischi d’oro, collocata in un tempio della città
indiana di Benares.
I sacerdoti del tempio si dedicavano a spostare la torre conformandosi alla descrizione del
rompicapo.
La pazienza di questi sacerdoti doveva veramente essere molta, dato che Il numero di
mosse necessario per descrivere il procedimento è rappresentato da un numero di 20 cifre

Building stories
Il pretesto per parlare di quest’opera del grande fumettista americano è il fatto che i 14
opuscoli possono essere letti in un ordine qualsiasi. L’autore racconta che durante
un’intervista ha scoperto quanti sono i modi possibili per leggerli tutti (il padre
dell’intervistatore era un matematico).

Lo stile grafico e narrativo di Ware è stato studiato a fondo dalla critica accademica, e ci
sono raccolte di saggi dedicati alle sue opere principali, per esempio
★ The Comics of Chris Ware: Drawing Is a Way of Thinking, a cura di David M. Ball
and Martha B. Kuhlman, University Press of Mississippi, 2010, dove troviamo:
- Analisi approfondite dell’uso che Ware fa di diagrammi e schemi
multidimensionali nella rappresentazione delle storie (Comics and the
Grammar of Diagrams di Isaac Cates, pagg. 90-104)
- Le relazioni con le idee del gruppo di letteratura potenziale Oulipo (In the
Comics Workshop: Chris Ware and the Oubapo di Martha B. Kuhlman, pagg.
78-89).

A proposito: quanti modi diversi di leggere Building Stories ci sono? Guardate il video: oltre a
scoprire la risposta, troverete qualcosa di più sulla letteratura potenziale.

Permutazioni
In questa lezione parliamo di un celebre problema combinatorio: generare le permutazioni di
un elenco di oggetti; Vedremo una soluzione ricorsiva del problema, ed useremo questa
soluzione anche per contare il numero di permutazioni di un elenco di oggetti.
Concluderemo la lezione con un piccolo esempio letterario
Building Stories è una graphic novel scritta e disegnata da Chris Ware e pubblicata nel
2012. È composta da 14 fascicoli di diverso formato, che possono essere letti in un ordine
qualsiasi.
Ciascuno di questi modi corrisponde ad una permutazione dei fascicoli. Quanti modi ci sono
per leggere Building Stories? ossia, quante sono le permutazioni di 14 oggetti? Il loro
numero è 87.178.291.200.

Per capire come abbiamo ottenuto questo numero, e definire la funzione che calcola il
numero delle permutazioni, vediamo un altro esempio, più semplice.
★ Abbiamo tre amici: Aldo, Bruno e Carlo.
Dobbiamo elencare tutti i modi possibili di metterli in fila, rispettando due vincoli:
1. nessuna posizione della fila può avere più di un occupante
2. Ciascuno dei tre deve essere nella fila
Ci sono questi 6 modi di allineare i nostri tre amici rispettando questi vincoli

Noi vogliamo escogitare un procedimento per generare tutte le permutazioni, che si applichi
più in generale ad un insieme di un numero arbitrario di elementi.
Vediamo una permutazione dei tre amici in modo ricorsivo, come una fila composta da uno
dei tre ed una permutazione dei rimanenti due.
Quando fissiamo uno dei tre amici come primo della fila, per esempio Aldo, abbiamo due
permutazioni dei due rimanenti: prima Bruno poi Carlo, e prima Carlo poi Bruno. Ripetiamo il
procedimento per ciascuno dei tre amici. Siccome in questo caso gli amici sono tre, e ci
sono due permutazioni di due oggetti, abbiamo in tutto 6 permutazioni dei 3 amici.

In generale, per n oggetti, a ogni scelta del primo della fila, che può essere fatta in n modi
distinti, abbiamo le permutazioni dei rimanenti n – 1. Se indichiamo con F(n) il numero di
permutazioni di un insieme di n oggetti, il ragionamento che abbiamo appena fatto ci
permette di concludere che ci sono n per F(n – 1) permutazioni di n oggetti.
Poi osserviamo che c’è un solo modo di permutare 0 oggetti, abbiamo una definizione
ricorsiva della funzione di numeri naturali che si chiama fattoriale

Vediamo ora un’applicazione pratica del procedimento che abbiamo descritto per generare
le permutazioni. Supponiamo che vogliate corteggiare una marchesa. Possiamo trovare in
Moliere un suggerimento per iniziare una lettera: questo tuttavia basta per una sola lettera.
Se abbiamo in programma un vero epistolario, possiamo estrarre quattro parti di questa
intestazione:
Mia dolce marchesa
i vostri begli occhi
mi fanno
morir d’amore
Questo ci permette di generare 24 inizi di altrettante lettere, perché 24 è il fattoriale di 4.
(4x3,4x2,4x1)

Questo procedimento combinatorio di generazione di testi è una delle possibilità esplorate in


quella che si chiama letteratura potenziale nell’ambito del gruppo di intellettuali francese
Oulipo, che aveva tra i suoi membri gli scrittori Raymond Quenenau e Georges Perec ed i

5) ALGORITMICA
1. Le tecniche per ordinare le informazioni nei database come quelli utilizzati dai
motori di
ricerca, consistono:
- nella costruzione di ordinamenti logici delle chiavi dei record di un dizionario,detti
indici, cui si riferiscono attraverso dei collegamenti
2. Che cos’è un problema algoritmico?
- Una relazione tra ingressi ammissibili e uscite corrette in funzione degli ingressi
3. Con visita di un grafo si intende:
- Un algoritmo che, dato un vertice o una lista di vertici di un grafo, esplora i vertici cui
è possibile accedere, direttamente o indirettamente, attraverso gli archi del grafo a
partire dai vertici dati
4. Le caratteristiche essenziali di un algoritmo sono:
- la descrizione non ambigua degli ingressi, la sequenza delle operazioni di base da
eseguire in funzione dell’ingresso e la garanzia che questa sequenza termini
5. I grafi sono modelli naturali:
- di informazioni reticolari non necessariamente gerarchiche, tra cui interessi
stabilire connessioni e percorsi
6. Che cos’è un modello di calcolo?
- una descrizione della rappresentazione dei dati e delle operazioni di base su di
essi
7. Un problema algoritmo si dice trattabile se:
- esiste un algoritmo il cui tempo di calcolo sia limitato da un polinomio dipendente
dalla dimensione dell’ingresso
8. L’algoritmo PageRank, con cui viene calcolata l’importanza delle pagine Web, si
basa su:
- il numero dei link verso la pagina in rapporto all’importanza delle pagine da cui
provengono ed al numero di link che da esse conducono ad altre pagine
9. astrattamente un grado è definito come:
- Un insieme di vertici ed uno di archi che connettono tra loro due vertici non
necessariamente distinti
10. le strutture dati utilizzate per la realizzazione di indici sono normalmente di tipo
gerarchico,ossia ad albero, anziché lineare perché:
- gli alberi utilizzati sono tali per cui non solo la ricerca, ma anche la modifica per
inserimento o cancellazione siano operazioni efficienti
11. qual è la differenza tra la visita di un grafo in ampiezza e quella in profondità a
partire da un vertice dato?
- La visita in ampiezza esplora vertici via via equidistanti dal vertice di partenza;
quella in profondità consiste nell’avanzare lungo un percorso finché si incontrano
vertici non visitati salvo tornare indietro per esplorare eventuali percorsi
alternativi
12. un problema algoritmo è insolubile quando:
- non esiste alcun algoritmo che possa risolvere il problema in tempo finito
13. quando viene immessa in un motore di ricerca un’interrogazione sotto forma di
una sequenza di parole, si innesca un processo che:
- cerca le parole dell’interrogazione in indici precedentemente costruiti
valutandone la pertinenza sulla base di parametri quali la distanza delle parole tra
loro nella pagina
14. una chiave di un dizionario è:
- una porzione di informazione attraverso cui si possono individuare in modo
univoco le singole unità o record all’interno del dizionario
15. delle affermazioni che seguono circa alcuni problemi tipici rispetto alla trattabilità,
intrattabilità o insolubilità, qual è la sola vera?
- trattabile l’ordinamento, intrattabile le torri di Hanoi

6) RICORSIONE
1. quante sono le permutazioni di un elenco di 5 oggetti?
- 120
2. indicare quale sequenza di numeri si ottiene calcolando f(0),f(1),f(2),… dove
f(0) = 1
f(n+1) = 2 * f(n)
- 1,2,4,8,16,32,64,…
3. nel calcolo del valore f(4) per la funzione
f(0)= 1
f(n+1)= f(n)*(n+1)
indicare quali sono i valori intermedi f(0),f(1),f(2),f(3)
- 1,1,2,6,24
4. quante mosse sono sufficienti a risolvere il problema della torre di Hanoi con 4
dischi?
- 15
5. date le equazioni
f(0) = 1
f(n+1) = f(n+2)
calcolare f(3)
- il calcolo non ha termine
6. quali sono le permutazioni dell’elenco ABC?
- ABC, ACB, BAC, CAB, CBA
7. data la funzione definita ricorsivamente dalle equazioni
f(0)=1
f(n+1)= 1 - f(n)
calcolare f(3)
- 0
8. consideriamo il problema della torre di Hanoi per 2 dischi e tre pioli A,B e C. Quali
delle seguenti sequenze di mosse è quella corretta per risolvere il problema di
spostare la torre dal piolo A al piolo B?
- A -> C, A -> B, C -> B
9. qual è la formula ricorsivi per la funzione f(n) che calcola il numero di permutazioni
di un
elenco di n oggetti?
- f(0)= 1, f(n+1)= f(n) * (n+1)

10. data la grammatica


F ⟶ N SV
SV ⟶ vede A N | corre A
A ⟶ bene | molto A
N ⟶ Mario | Maria
indicare quale delle seguenti frasi non si può generare
- mario corre molto
11. data la sequenza 0,1,0,1,0,1,0,1,…
indicare quale sistema di equazioni la definisce ricorsivamente
- f(0) = 0,f(n+1)=1-f(n)
12. data la funzione definita ricorsivamente dalle equazioni
f(0)=1
f(n+1)= 2 * f(n)
calcolare f(3)
- 8
13. supponiamo che A, B e C siano tre proposizioni. Quanti modi ci sono per
associare a
ciascuna di queste proposizioni un valore Vero o Falso?
- ogni valore di verità può essere associato a ciascuna proposizione in modo
indipendente dalle altre, quindi ci sono 2 * 2 * 2 = 8 modi possibili per associare a
ciascuna proposizione un valore
14. data la funzione definita dalle equazioni
f(0)= 1
f(n+1)= n
calcolare f(3)
- 2
15. data la grammatica
F ⟶ mi sento A
A ⟶ bene | molto molto A
indicare quale delle seguenti frasi non si può generare
- mi sento molto molto molto bene
16. si consideri la frase
questa frase è vera
– può essere vera
17. calcolare il valore di f(-3) data l’equazione
f(n)= 2 * f(n-1)
- il calcolo della funzione non ha termine
18. consideriamo il problema della torre di Hanoi per 3 dischi e tre pioli A,B e C. Quali
delle
seguenti sequenze di mosse è quella corretta per risolvere il problema di spostare la
torre
dal piolo A al piolo C?
- A ⟶ C,A ⟶ B,C ⟶ B,A ⟶ C,B ⟶ A,B ⟶ C,A ⟶ C
19. data la funzione definita ricorsivamente dalle equazioni
f(0)= 1
f(n+1)= f(n)
calcolare f(3)
- 1
20. che cos’è una permutazione di un elenco E di oggetti?
- un elenco degli stessi oggetti, in cui ogni oggetto può comparire in una posizione
diversa da quella in cui compare in E

Potrebbero piacerti anche