IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la...

114
IL MODELLO CLIENTE / SERVITORE Cliente Servitore am biente condiviso Servitore Cliente controllo & informazione

Transcript of IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la...

Page 1: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

IL MODELLO CLIENTE / SERVITORE

Cliente Servitore

ambiente condiviso

Servitore

Cliente

controllo &informazione

Page 2: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

Servitore:• un qualunque ente computazionale capace di

nascondere la propria organizzazione interna

• presentando ai clienti una precisa interfaccia per lo scambio di informazioni.

Cliente:• qualunque ente in grado di invocare uno o

più servitori per svolgere il proprio compito.

CLIENTI E SERVITORI

Page 3: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

SERVITORI

Un servitore può• essere passivo o attivo• servire molti clienti oppure costituire la

risorsa privata di uno specifico cliente– in particolare: può servire un cliente alla volta,

in sequenza, oppure più clienti per volta, in parallelo

• trasformarsi a sua volta in cliente, invocando altri servitori o anche se stesso.

Page 4: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

COMUNICAZIONE CLIENTE / SERVITORE

Lo scambio di informazioni tra uncliente e un servitore può avvenire

• in modo esplicito tramite le interfacce stabilite dal servitore

• in modo implicito tramite aree-dati accessibili ad entrambi.

Page 5: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

FUNZIONI

Una funzione permette di dare un nome a una espressione rendendola parametrica

Esempi (pseudo-C):float f(){ 2 + 3 * sin(0.75); }

float f1(int x) {

2 + x * sin(0.75); }

Page 6: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

FUNZIONI come COMPONENTI SW

Una funzione è un componentesoftware che cattura l’idea mate-matica di funzione

f : A B ... Q S molti possibili ingressi

(che non vengono modificati!) una sola uscita (il risultato)

Page 7: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

FUNZIONI come SERVITORI

Una funzione• riceve dati di ingresso in corrispondenza ai

parametri• ha come corpo una espressione, la cui

valutazione fornisce un risultato• denota un valore in corrispondenza al suo

nome

Page 8: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

FUNZIONI come SERVITORI

Esempio

• se x vale 1

• e f è la funzione R R

f = 3 * x2 + x - 3

• allora f(x) denota il valore 1.

Page 9: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

FUNZIONI come SERVITORI

Una funzione è un servitore• passivo• che serve un cliente per volta• che può trasformarsi in cliente

invocando se stessa

Page 10: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

FUNZIONI come SERVITORI

• Una funzione è un servitore dotato di nome che incapsula le istruzioni che realizzano un certo servizio.

• Per chiedere al servitore di svolgere il servizio occorre – chiamare tale servitore (per nome)– fornirgli le necessarie informazioni

Come far comunicare cliente e servitore?

Page 11: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

COMUNICAZIONE CLIENTE/SERVITORE

Nel caso di una funzione,

cliente e servitore comunicano mediante l’interfaccia della funzione.

Page 12: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

FUNZIONI: INTERFACCIA

• L’interfaccia di una funzione comprende– nome della funzione– lista dei parametri– tipo del valore da essa denotato

• è spesso chiamata firma (signature)• esplicita il contratto di servizio

fra cliente e servitore.

Page 13: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

COMUNICAZIONE CLIENTE/SERVITORE

Cliente e servitore comunicano quindimediante

i parametri trasmessi dal cliente al servitore all’atto della chiamata(direzione: dal cliente al servitore)

il valore restituito dal servitore al cliente(direzione: dal servitore al cliente)

Page 14: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UN ESEMPIO

int max (int x, int y ){return x>y ? x : y;

}

Il simbolo max denota il nome della nuovafunzione

Le variabili intere x e y sono i parametridella nuova funzione

Il valore restituito è un intero.

Page 15: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

FUNZIONI & INFORMATION HIDING

• La struttura interna (corpo) di una funzione è completamente inaccessibile dall’esterno.

• Così facendo si garantisce protezione dell’informazione secondo il principio del suo “nascondimento” (information hiding)

Page 16: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

FUNZIONI IN UN PROGRAMMA C

• Un programma C è un insieme di funzioni:

<programma> ::=

{ <unità-di-traduzione> }

<unità-di-traduzione> ::= <definizione-di-funzione> | <dichiarazione-di-funzione> | …

• Il main è semplicemente la funzione, di no-me prefissato, dove inizia l’elaborazione.

Page 17: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

DEFINIZIONE DI FUNZIONE: struttura

Una <definizione-di-funzione> è definita

dalla produzione:

<definizione-di-funzione> ::=

<tipoValore><nome>(<parametri>){ <corpo>

}

Page 18: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

DEFINIZIONE DI FUNZIONE: parametri

Una <definizione-di-funzione> è definita

dalla produzione:

<definizione-di-funzione> ::=

<tipoValore> <nome>(< parametri >){ <corpo>

}• o una lista vuota: void• o una lista di variabili

(separate da virgole) visibili soloentro il corpo della funzione.

Page 19: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

DEFINIZIONE DI FUNZIONE: corpo

Una <definizione-di-funzione> è definita

dalla produzione:

<definizione-di-funzione> ::=

<tipoValore> <nome>(< parametri >){ <corpo>

} <corpo> è tutto ciò che sta fra {}La forma base è

return <espressione> ;

Page 20: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

DEFINIZIONE DI FUNZIONE: tipo

Una <definizione-di-funzione> è definita

dalla produzione:

<definizione-di-funzione> ::=

<tipoValore> <nome>(< parametri >){ <corpo>

} il tipo della funzione deve coinci-dere col tipo dell’espressione checostituisce il corpo della funzione

Page 21: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

FUNZIONI COME COMPONENTI SOFTWARE: NASCITA E MORTE

• All’atto della chiamata, l’esecuzione del cliente viene sospesa e il controllo passa al servitore.

• Il servitore “vive” solo per il tempo necessario a svolgere il servizio.

• Al termine, il servitore “muore”,e l’esecuzione torna al cliente.

Page 22: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

CHIAMATA DI FUNZIONE

La chiamata di funzione è un’espressionedella forma

<nomefunzione> ( <parametri-attuali> )

dove:<parametri-attuali> ::=

[ <espressione> ] { , <espressione> }

Page 23: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

L’invocazione di una funzione da parte di un cliente costituisce un particolare tipo di espressione.

CHIAMATE DI FUNZIONE & ESPRESSIONI

<espr> ::= <term> | <espr> + <term > | <espr> - <term >

<term > ::= <fattore> | <term > * <fattore> |<term > / <fattore> | <term > % <fattore>

<fattore> ::= [ - | + ] <num ero> | ( <espr> )|<variabile> | <chiam ata di funzione>

Page 24: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

RITORNO DA FUNZIONE

L’istruzione return provoca la restitu-zione del controllo al cliente, unitamente al valore dell’espres-sione che la segue.

Eventuali istruzioni successive alla return non saranno mai eseguite!

Page 25: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

IL PROBLEMA DEI SIMBOLI

f(x) + g( f(x), q( x + f(y)))

Per fornire il risultato, dobbiamo conoscere:• la definizione delle funzioni f, g, q• i valori di x e y

Come conoscerli?

Page 26: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

SIMBOLI & SIGNIFICATO

Come conoscere il significato di un simbolo? o esiste una “convenzione diffusa”,

una “cultura comune”, che associa ad un simbolo un preciso significato;

o esiste un ente di riferimento che specifica in modo esplicito il significato di un simbolo.

Page 27: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

BINDING & ENVIRONMENT

• La conoscenza di cosa un simbolo denota viene espressa da una legame (binding) tra il simbolo e uno o più attributi.

• La collezione dei binding valida in (un certo punto di) un programma si chiama environment.

Page 28: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UN ESEMPIO

Sia f N->N: f(x)=x+x

Sia z = 2

f(z) + f(z) vale 8

f(2) + f(y) vale ???

g(z) vale ???

Page 29: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

SCOPE & SCOPE RULES

• Tutte le occorrenze di un nome nel testo di un programma a cui si applica un dato binding si dicono essere entro la stessa portata o scope del binding.

• Le regole in base a cui si stabilisce la portata di un binding si dicono regole di visibilità o scope rules.

Page 30: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

ESEMPIO

Sia f N->N: f(x)=x+x

Sia z = 2

f(z) + f(z) vale 8

f(2) + f(y) vale ???

Sia g N->N: g(x)=x*x

g(z) vale 4

f(g(z)) vale 8

Page 31: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

DEFINIZIONE DI NUOVE FUNZIONI

• Per dare un nome alla nuova funzione,• il linguaggio deve introdurre costrutti per

estendere un environment • aggiungendo ad esso il nuovo binding

che lega il nome scelto per la funzione all’entità che realizza quella specifica funzione.

Page 32: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

DEFINIZIONE DI NUOVE FUNZIONI

La definizione di funzione unisce la denotazione di una nuova funzione

l’attribuzione di un nome ad essa

L’environment corrente viene arricchito con uno nuovo binding tra il nome della funzione, e

la sua rappresentazione interna

Page 33: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

FUNZIONI: IL MODELLO APPLICATIVO

1) Valutazione, nell’environment corrente, del simbolo che denota il nome della funzione;

2) Valutazione, nell’environment corrente, delle espressioni che denotano i parametri;

3) Commutazione all’environment di definizione della funzione.

Page 34: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

FUNZIONI: IL MODELLO APPLICATIVO

4) Chiamata della funzione;5) Esecuzione del corpo della funzione

(nel suo environment di definizione);6) Restituzione al chiamante di

– controllo – risultato

con ripristino dell’environment esistente al momento della chiamata.

Page 35: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

L’ENVIRONMENT

• La definizione di una funzione introduce un nuovo binding nell’environment di definizione della funzione – in C, il global environment

• Al momento dell’invocazione, si crea un nuovo environment – una struttura che contiene i binding dei

parametri e degli identificatori dichiarati localmente alla funzione.

Page 36: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

ESEMPIO

int max (int x, int y ){return x>y ? x : y;

}

L’environment corrente viene arricchito di un nuovo binding:

max / CodiceDellaFunzione

Quando max viene chiamata, si commuta a un nuovo environment, in cui sono definite le variabili intere x e y

Page 37: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

COMUNICAZIONE CLIENTE SERVITORE

Il cliente passa informazioni al servitoremediante una serie di parametri attuali.

• Parametri formali :– sono specificati nella dichiarazione del servitore– esplicitano il contratto fra servitore e cliente– indicano cosa il servitore si aspetta dal cliente

• Parametri attuali :– sono trasmessi dal cliente all’atto della chiamata– devono corrispondere ai parametri formali

in numero, posizione e tipo

Page 38: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

COMUNICAZIONE CLIENTE SERVITORE

Il cliente passa informazioni al servitoremediante una serie di parametri attuali.

I Parametri attuali sono legati ai parametri formali al momento della chiamata,

in modo dinamico.

Tale legame:

• vale solo per l’invocazione corrente

• vale solo per la durata della funzione.

Page 39: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

IL NOSTRO ESEMPIO

Il servitore...

int max (int x, int y ){return x>y ? x : y;

} … e un possibile cliente:

main(){int z = 8;int m = max(2*z,13);

}

Page 40: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

IL NOSTRO ESEMPIO

Il servitore...

int max (int x, int y ){return x>y ? x : y;

} … e un possibile cliente:

main(){int z = 8;int m = max(2*z,13);

}

1) Valutazione del simbolo znell’environment corrente

Si trova che z vale 8.

Page 41: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

IL NOSTRO ESEMPIO

Il servitore...

int max (int x, int y ){return x>y ? x : y;

} … e un possibile cliente:

main(){int z = 8;int m = max(2*z,13);

}

2) Calcolo dell’espressione 2*znell’environment corrente

Si trova che vale 16.

Page 42: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

IL NOSTRO ESEMPIO

Il servitore...

int max (int x, int y ){return x>y ? x : y;

} … e un possibile cliente:

main(){int z = 8;int m = max(2*z,13);

}

3) Invocazione della funzione max con parametri attuali16 e 13.

Il controllo passa al servitore.

Page 43: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

IL NOSTRO ESEMPIO

Il servitore...

int max (int x, int y ){return x>y ? x : y;

} … e un possibile cliente:

main(){int z = 8;int m = max(2*z,13);

}

4) I parametri formali x e y vengono legati ai parametriattuali 16 e 13.

Inizia l’esecuzione del servitore.

Page 44: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

IL NOSTRO ESEMPIO

Il servitore...

int max (int x, int y ){return x>y ? x : y;

} … e un possibile cliente:

main(){int z = 8;int m = max(2*z,13);

}

5) Viene valutata l’espressionecondizionale nell’environment del servitore. Il risultato è 16.

Page 45: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

IL NOSTRO ESEMPIO

Il servitore...

int max (int x, int y ){return x>y ? x : y;

} … e un possibile cliente:

main(){int z = 8;int m = max(2*z,13);

}

6) Il valore così determinato (16)viene restituito al cliente.

Il servitore termina e il controllo torna al cliente.

Page 46: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

IL NOSTRO ESEMPIO

Il servitore...

int max (int x, int y ){return x>y ? x : y;

} … e un possibile cliente:

main(){int z = 8;int m = max(2*z,13);

}

7) Il valore restituito (16) viene usato per inizializzare lavariabile m (nell’environment del cliente)

Page 47: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

RIASSUNTO

All’atto dell’invocazione di una funzione:• si crea una nuova attivazione (istanza)

del servitore• si alloca la memoria per i parametri

(e le eventuali variabili locali)• si trasferiscono i parametri al servitore• si trasferisce il controllo al servitore• si esegue il codice della funzione.

Page 48: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

PASSAGGIO DEI PARAMETRI

In generale, un parametro può esseretrasferito: per valore o copia (by value)

si trasferisce il valore del parametro attuale

per riferimento (by reference) si trasferisce un riferimento al parametro

attuale

Page 49: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

PASSAGGIO PER VALORE

si trasferisce una copia del valore del parametro attuale

cliente

z 45

Page 50: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

PASSAGGIO PER VALORE

si trasferisce una copia del valore del parametro attuale

cliente servitore

z 45copia

w45

valore (copiato) di z

istanza del servitore

Page 51: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

PASSAGGIO PER VALORE

si trasferisce una copia del valore del parametro attuale

cliente servitore

z 45copia

w45

valore (copiato) di z

istanza del servitore

Ogni azione fatta su w è strettamente locale

al servitore

Page 52: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

PASSAGGIO PER RIFERIMENTO

si trasferisce un riferimento al parametro attuale

cliente

z 45

Page 53: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

PASSAGGIO PER RIFERIMENTO

si trasferisce un riferimento al parametro attuale

cliente servitore

z 45riferimento

w

riferimento a z (indirizzo)

istanza del servitore

Page 54: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

PASSAGGIO PER RIFERIMENTO

si trasferisce un riferimento al parametro attuale

cliente servitore

z 45riferimento

w

riferimento a z (indirizzo)

istanza del servitore

Ogni azione fatta su w è in realtà fatta sulla

variabile z del cliente!

Page 55: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

PASSAGGIO DEI PARAMETRI IN C

In C, i parametri sono trasferiti sempre e soloper valore (by value) si trasferisce una copia del parametro

attuale, non l’originale! tale copia è strettamente privata e locale a

quel servitore il servitore potrebbe quindi alterare il

valore ricevuto, senza che ciò abbia alcun impatto sul cliente

Page 56: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

PASSAGGIO DEI PARAMETRI IN C

In C, i parametri sono trasferiti sempre e soloper valore (by value)

Conseguenza: è impossibile usare un parametro per

trasferire informazioni verso il cliente per trasferire (una) informazione al cliente

si sfrutta il valore di ritorno della funzione

Page 57: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

ESEMPIO: VALORE ASSOLUTO

• Definizione formale:

|x|: N N |x| vale x se x 0|x| vale -x se x 0

• Codifica sotto forma di funzione C:

int valAss(int x) {

return (x<0) ? -x : x;

}

Page 58: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

ESEMPIO: VALORE ASSOLUTO

Servitore & Cliente:

int valAss(int x) {return (x<0) ? -x : x;

}

main(){int z = -87;int absz = valAss(z);int abs4 = valAss(4);

}

Page 59: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

ESEMPIO: VALORE ASSOLUTO

Servitore & Cliente:

int valAss(int x) {return (x<0) ? -x : x;

}

main(){int z = -87;int absz = valAss(z);int abs4 = valAss(4);

}

Quando valAss(z) viene chiamata,il valore attuale di z, valutato nel-l’environment corrente (-87), vienecopiato e passato a valAss.

Page 60: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

ESEMPIO: VALORE ASSOLUTO

Servitore & Cliente:

int valAss(int x) {return (x<0) ? -x : x;

}

main(){int z = -87;int absz = valAss(z);int abs4 = valAss(4);

}

valAss riceve quindi una copia delvalore -87 e la lega al simbolo x.Poi si valuta l’espressione, che quivale 87, e si restituisce questo valore.

Page 61: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

ESEMPIO: VALORE ASSOLUTO

Servitore & Cliente:

int valAss(int x) {return (x<0) ? -x : x;

}

main(){int z = -87;int absz = valAss(z);int abs4 = valAss(4);

}

Il valore restituito (87) viene usato per inizializzare la variabile absz.

Page 62: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

ESEMPIO: MASSIMO DI DUE NUMERI

• Definizione formale:

max: N N N max(x,y) vale x se x ymax(x,y) vale y se x < y

• Codifica sotto forma di funzione C:

int max(int x, int y) {

return (x<y) ? y : x;

}

Page 63: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

ESEMPIO: MASSIMO DI DUE NUMERI

Servitore & Cliente:

int max(int x, int y) {return (x<y) ? y : x;

}

main(){int z = -87, y = 12;int m = max(z,18);int n = max(4*y,z+100);

}

Page 64: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

ESEMPIO: MASSIMO DI DUE NUMERI

Servitore & Cliente:

int max(int x, int y) {return (x<y) ? y : x;

}

main(){int z = -87, y = 12;int m = max(z,18);int n = max(4*y,z+100);

}

Si valutano le due espressioni checostituiscono i parametri attuali (nel-l’environment del main) e si trasmette alla funzione copia dei valori ottenuti.

Page 65: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

ESEMPIO: MASSIMO DI DUE NUMERI

Servitore & Cliente:

int max(int x, int y) {return (x<y) ? y : x;

}

main(){int z = -87, y = 12;int m = max(z,18);int n = max(4*y,z+100);

}

La funzione riceve copia dei valori -87e 18, e li lega ai simboli x e y. Poi sivaluta l’espressione. Il risultato (18)è restituito al main chiamante.

Page 66: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

PASSAGGIO DEI PARAMETRI IN C

Perché il C adotta sempre e solo il passaggioper valore (by value)?

è sicuro: le variabili del chiamante e del chiamato sono completamente disac-coppiate

consente di ragionare per componenti e servizi: la struttura interna dei singoli componenti è irrilevante

Page 67: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

PASSAGGIO DEI PARAMETRI IN C

Limiti:

consente di restituire al cliente solo valori di tipo (relativamente) semplice

non consente di restituire collezioni di valori

non consente di scrivere componenti software il cui scopo sia diverso dal calcolo di una espressione

Page 68: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

PASSAGGIO DEI PARAMETRI

Molti linguaggi mettono a disposizione ilpassaggio per riferimento (by reference)

non si trasferisce una copia del valore del parametro attuale

si trasferisce un riferimento al parametro, in modo da dare al servitore accesso di- retto al parametro in possesso del cliente il servitore accede e modifica direttamente il

dato del cliente.

Page 69: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

PASSAGGIO DEI PARAMETRI IN C

Il C non supporta direttamente il passaggioper riferimento

è una grave mancanza! il C lo fornisce indirettamente solo per

alcuni tipi di dati ergo, occorre costruirselo quando serve.

(vedremo dei casi)

Il C++ e Java invece lo forniscono.

Page 70: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

DEFINIZIONE DI NUOVE FUNZIONI & STRATEGIE DI COMPOSIZIONE

La capacità di definire nuove funzionipermette:• di definire nuove operazioni• di introdurre variabili per denotare

i dati in modo simbolico• di esprimere la ripetizione di una

espressione per un numero (prefissatoo meno) di volte.

Page 71: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

STRATEGIE DI COMPOSIZIONE

Tre grandi approcci:

1) la composizione di funzioni;2) le espressioni condizionali;3) la ricorsione.

Le funzioni definibili in termini di un insiemeprescelto di primitive e delle precedentistrategie di composizione costituiscono uninsieme detto delle funzioni ricorsive generali.

Page 72: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

1) COMPOSIZIONE DI FUNZIONI

I parametri in una chiamata di funzione pos-sono consistere/comprendere altre funzioni

Es: f(x) + g(f(x), q(x + f(y)))

x1 = f(x) x2 = f(x) (mossa evitabile da un automa “intelligente”) x3 = f(y) x4 = x + x3 x5 = q( x4 ) x6 = g( x2,x5 ) x7 = x1 + x6

Page 73: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

2) ESPRESSIONE CONDIZIONALE

• L’espressione condizionale riflette la consuetudine matematica di definire le funzioni per elencazione di casi.

• Esempio:

abs: N -> N

abs(x) vale x se x 0abs(x) vale -x se x 0

Page 74: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

3) LA RICORSIONE

• La ricorsione consiste nella pos-sibilità di definire una funzione in termini di se stessa.

• È basata sul principio di induzione matematica:– se una proprietà P vale per n=n0

– e si può provare che, assumendola valida per n, allora vale per n+1

allora P vale per ogni nn0

Page 75: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

LA RICORSIONE

• Operativamente, risolvere un problema con un approccio ricorsivo comporta– di identificare un “caso base” la cui

soluzione sia “ovvia”– di riuscire a esprimere la soluzione al

caso generico n in termini dello stesso problema in uno o più casi più semplici (n-1, n-2, etc).

Page 76: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

LA RICORSIONE: ESEMPIO

Esempio!: N N

n! vale 1 se n 0n! vale n*(n-1)! se n > 0

Codifica:

int fact(int n) {return n==0 ? 1 : n*fact(n-1);

}

Page 77: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

LA RICORSIONE: ESEMPIO

Esempio!: N N

n! vale 1 se n 0n! vale n*(n-1)! se n > 0

Codifica:

int fact(int n) {return n==0 ? 1 : n*fact(n-1);

}

Attenzione: la codifica non corrisponde alla specifica!!

Il 2° caso si applica per n0,cioè anche per n<0 !!

MA COSÌ PUÒ NON TERMINARE!

Page 78: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

LA RICORSIONE: ESEMPIO

Esempio!: N N

n! vale 1 se n 0n! vale n*(n-1)! se n > 0

Codifica:

int fact(int n) { /* return n==0 ? 1 : n*fact(n-1); */

return n>0 ? n*fact(n-1) : 1; }

Nuova codifica

Page 79: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

ESEMPIO: FATTORIALE

Servitore & Cliente:

int fatt(int n) {return (n>0) ? n*fatt(n-1) : 1;

}

main(){int z = 5;int fz = fatt(z+2);int f6 = fatt(6);

}

Page 80: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

ESEMPIO: FATTORIALE

Servitore & Cliente:

int fatt(int n) {return (n>0) ? n*fatt(n-1) : 1;

}

main(){int z = 5;int fz = fatt(z+2);int f6 = fatt(6);

}

Si valuta l’espressione che costituisce ilparametro attuale (nell’environment del main) e si trasmette alla funzione fatt una copia del valore così ottenuto (7).

Page 81: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

ESEMPIO: FATTORIALE

Servitore & Cliente:

int fatt(int n) {return (n>0) ? n*fatt(n-1) : 1;

}

main(){int z = 5;int fz = fatt(z+2);int f6 = fatt(6);

}

La funzione riceve una copia del valore 7e la lega al simbolo n. Poi valuta l’espres-sione condizionale: ciò impone di valutare una espressione che contiene una nuova chiamata di funzione.

Page 82: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

ESEMPIO: FATTORIALE

Servitore & Cliente:

int fatt(int n) {return (n>0) ? n*fatt(n-1) : 1;

}

main(){int z = 5;int fz = fatt(z+2);int f6 = fatt(6);

}

Si valuta quindi, nell’environment di fatt,l’espressione n-1 (che vale 6), e si effettuauna nuova chiamata al servitore fatt, pas-sandogli una copia del valore 6.

Page 83: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

ESEMPIO: FATTORIALE

Servitore & Cliente:

int fatt(int n) {return (n>0) ? n*fatt(n-1) : 1;

}

main(){int z = 5;int fz = fatt(z+2);int f6 = fatt(6);

}

Il (nuovo) servitore riceve quindi una copiadel valore 6 e, come sopra, valuta l’espres-sione condizionale. Ciò lo porta a doverfare una nuova chiamata passando 5.

Page 84: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

ESEMPIO: FATTORIALE

Servitore & Cliente:

int fatt(int n) {return (n>0) ? n*fatt(n-1) : 1;

}

main(){int z = 5;int fz = fatt(z+2);int f6 = fatt(6);

}

…la cosa prosegue,

servitore dopo servitore.....

Page 85: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

ESEMPIO: FATTORIALE

Servitore & Cliente:

int fatt(int n) {return (n>0) ? n*fatt(n-1) : 1;

}

main(){int z = 5;int fz = fatt(z+2);int f6 = fatt(6);

}

Prima o poi, dato che il valore passato calaogni volta, si giunge a invocare fatt conparametro 1. In questo caso, la valutazionedell’espressione dà come risultato 1.

Page 86: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

ESEMPIO: FATTORIALE

Servitore & Cliente:

int fatt(int n) {return (n>0) ? n*fatt(n-1) : 1;

}

main(){int z = 5;int fz = fatt(z+2);int f6 = fatt(6);

}

Ciò chiude la sequenza di chiamate ricorsive. Il controllo torna al servitoreprecedente, che può finalmente valutarel’espressione n*1 (valutando n nel suo environment, dove vale 2) ottenendo 2.

Page 87: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

ESEMPIO: FATTORIALE

Servitore & Cliente:

int fatt(int n) {return (n>0) ? n*fatt(n-1) : 1;

}

main(){int z = 5;int fz = fatt(z+2);int f6 = fatt(6);

}

Il valore 2 viene restituito al servitore pre-cedente, che a sua volta può così valutarel’espressione n*2 (valutando n nel suo environment, dove vale 3) ottenendo 6.

Page 88: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

ESEMPIO: FATTORIALE

Servitore & Cliente:

int fatt(int n) {return (n>0) ? n*fatt(n-1) : 1;

}

main(){int z = 5;int fz = fatt(z+2);int f6 = fatt(6);

}

…la cosa prosegue

...

Page 89: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

ESEMPIO: FATTORIALE

Servitore & Cliente:

int fatt(int n) {return (n>0) ? n*fatt(n-1) : 1;

}

main(){int z = 5;int fz = fatt(z+2);int f6 = fatt(6);

}

Prima o poi, a forza di retrocedere, si tornaal primo servitore attivato, che può quindivalutare l’espressione n*720 (valutando n nel suo environment, dove vale 7), giun-gendo così a trovare il valore 5040.

Page 90: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

ESEMPIO: FATTORIALE

Servitore & Cliente:

int fatt(int n) {return (n>0) ? n*fatt(n-1) : 1;

}

main(){int z = 5;int fz = fatt(z+2);int f6 = fatt(6);

}

Il valore 5040, restituito dal servitorefatt, può quindi essere usato per inizializzare la variabile fz.

Page 91: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UN ALTRO ESEMPIO

Problema:calcolare la somma dei primi N interi

Specifica:

Considera la somma (1+2+3+...+(N-1)+N comecomposta di due termini:• (1+2+3+...+(N-1))• N

Esiste un caso banale assolutamente ovvio:• la somma fino a 1 vale 1.

Page 92: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UN ALTRO ESEMPIO

Problema:calcolare la somma dei primi N interi

Specifica:

Considera la somma (1+2+3+...+(N-1)+N comecomposta di due termini:• (1+2+3+...+(N-1))• N

Esiste un caso banale assolutamente ovvio:• la somma fino a 1 vale 1.

Il primo termine non è altro che la soluzione allo stesso problema inun caso più semplice

Il secondo termine è un valore già noto.

Page 93: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UN ALTRO ESEMPIO

Problema:calcolare la somma dei primi N interi

Codifica:

int sommaFinoA(int n){ return (n==1) ? 1 :

sommaFinoA(n-1) + n;}

Page 94: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UN TERZO ESEMPIO

Problema:calcolare l’N-esimo numero di Fibonacci

0, se n=0

fib(n-1) + fib(n-2), altrimenti

fib (n) = 1, se n=1

Page 95: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UN TERZO ESEMPIO

Problema:calcolare l’N-esimo numero di Fibonacci

Codifica:unsigned fibonacci(unsigned n) { return (n<2) : n ?

fibonacci(n-1) + fibonacci(n-2);

}

Page 96: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UN TERZO ESEMPIO

Problema:calcolare l’N-esimo numero di Fibonacci

Codifica:unsigned fibonacci(unsigned n) { return (n<2) : n ?

fibonacci(n-1) + fibonacci(n-2);

}

Ricorsione non lineare: ogniinvocazione del servitore causadue nuove chiamate al servitore medesimo.

Page 97: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UNA RIFLESSIONE

Negli esempi di ricorsione visti finora

fattoriale

somma dei primi N interi

calcolo dell’N-esimo numero di Fibonacci

si inizia a sintetizzare il risultato solo dopo che si sono aperte tutte le chiamate, “a ritroso”, mentre le chiamate si chiudono.

Page 98: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UNA RIFLESSIONE

Le chiamate ricorsive decompongono via via il problema, ma non calcolano nulla

Il risultato viene sintetizzato a partire dalla fine, perché prima occorre arrivare al caso “banale”: il caso “banale” fornisce il valore di partenza

poi, e solo poi, si sintetizzano, “a ritroso”, i successivi risultati parziali.

Page 99: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UNA RIFLESSIONE

Ciò indica che tali soluzioni

sono sintatticamente ricorsive

e danno luogo a un processo computa-zionale effettivamente ricorsivo.

Page 100: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UN ESEMPIO DIVERSO

Problema:trovare il Massimo Comun Divisore tra N e M

m, se m=n

MCD(m, n-m), se m<n

MCD(m, n) = MCD(m-n, n), se m>n

Page 101: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UN ESEMPIO DIVERSO

Problema:calcolare il Massimo Comun Divisore tra N e M

Codifica:int mcd(int m, int n){

return (m==n) : m ? (m>n) ? mcd(m-n, n) : mcd(m, n-m);

}

Page 102: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UN ESEMPIO DIVERSO

Servitore & Cliente:

int mcd(int m, int n){return (m==n) : m ? (m>n) ? mcd(m-n, n) :

mcd(m, n-m);}main(){

int m = mcd(36,15);}

Page 103: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UN ESEMPIO DIVERSO

Servitore & Cliente:

int mcd(int m, int n){return (m==n) : m ? (m>n) ? mcd(m-n, n) :

mcd(m, n-m);}main(){

int m = mcd(36,15);}

Si valutano i parametri attuali e si invoca la funzione con parametri 36 e 15

Page 104: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UN ESEMPIO DIVERSO

Servitore & Cliente:

int mcd(int m, int n){return (m==n) : m ? (m>n) ? mcd(m-n, n) :

mcd(m, n-m);}main(){

int m = mcd(36,15);}

Si legano i parametri 36 e 15 ai parametriformali m e n, e si valuta l’espressionecondizionale.

Page 105: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UN ESEMPIO DIVERSO

Servitore & Cliente:

int mcd(int m, int n){return (m==n) : m ? (m>n) ? mcd(m-n, n) :

mcd(m, n-m);}main(){

int m = mcd(36,15);}

Poiché 36 15, si invoca nuovamente lafunzione con parametri m-n (21) e n (15).

Page 106: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UN ESEMPIO DIVERSO

Servitore & Cliente:

int mcd(int m, int n){return (m==n) : m ? (m>n) ? mcd(m-n, n) :

mcd(m, n-m);}main(){

int m = mcd(36,15);}

Il nuovo servitore, poiché 21 15, fa lastessa cosa e invoca nuovamente lafunzione con parametri m-n (6) e n (15).

Page 107: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UN ESEMPIO DIVERSO

Servitore & Cliente:

int mcd(int m, int n){return (m==n) : m ? (m>n) ? mcd(m-n, n) :

mcd(m, n-m);}main(){

int m = mcd(36,15);}

Il nuovo servitore, poiché 6 15, invoca un ulteriore servitore con parametri m (6) e n-m (9).

Page 108: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UN ESEMPIO DIVERSO

Servitore & Cliente:

int mcd(int m, int n){return (m==n) : m ? (m>n) ? mcd(m-n, n) :

mcd(m, n-m);}main(){

int m = mcd(36,15);}

Poiché 6 9, si ha una nuova chiamatacon parametri m (6) e n-m (3).

Page 109: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UN ESEMPIO DIVERSO

Servitore & Cliente:

int mcd(int m, int n){return (m==n) : m ? (m>n) ? mcd(m-n, n) :

mcd(m, n-m);}main(){

int m = mcd(36,15);}

Poiché 6 3, si ha una nuova invocazione(l’ultima!) con parametri m-n (3) e n (3).

Page 110: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UN ESEMPIO DIVERSO

Servitore & Cliente:

int mcd(int m, int n){return (m==n) : m ? (m>n) ? mcd(m-n, n) :

mcd(m, n-m);}main(){

int m = mcd(36,15);}

Poiché 3 = 3, il servitore termina erestituisce come risultato 3.

Page 111: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UN ESEMPIO DIVERSO

Perché questo esempio è “diverso” ?

il risultato viene sintetizzato via via che le chiamate si aprono, “in avanti”

quando le chiamate si chiudono non si fa altro che riportare indietro, fino al cliente, il risultato ottenuto.

Page 112: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UNA RIFLESSIONE

La soluzione ricorsiva individuata per l’MCD è sintatticamente ricorsiva...

… ma dà luogo a un processo computa-zionale diverso dal precedente:

un processo computazionale ITERATIVO

Il risultato viene sintetizzato in avanti ogni passo decompone e calcola

e porta in avanti il nuovo risultato parziale

Page 113: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

UNA RIFLESSIONE

Ogni processo computazionale ITERATIVOcalcola a ogni passo un risultato parziale

dopo k passi, si ha a disposizione il risultato parziale relativo al caso k

questo non è vero nei processi computa-zionali ricorsivi là, finché non si sono aperte tutte le chiamate,

non è disponibile nessun risultato!

Page 114: IL MODELLO CLIENTE / SERVITORE. Servitore: un qualunque ente computazionale capace di nascondere la propria organizzazione interna presentando ai clienti.

RICORSIONE TAIL

Una ricorsione che realizza un processocomputazionale ITERATIVOè una ricorsione solo apparente

la chiamata ricorsiva è sempre l’ultima istruzione i calcoli sono fatti prima la chiamata serve solo, dopo averli fatti, per

proseguire la computazione

questa forma di ricorsione si chiama RICORSIONE TAIL (“ricorsione in coda”)