Compito scritto, 12 Luglio 2001

Transcript

Compito scritto, 12 Luglio 2001
3529$6&5,77$',)21'$0(17,',,1)250$7,&$$
3URI0HOOR3URI0LODQR
/8*/,2
(VHUFL]LRSXQWL
Si scriva una funzione ricorsiva
valore
GRXEOHIGRXEOHDLQW Q che calcoli il seguente
Q
Σ (DL?D
L (VHUFL]LRSXQWL
Dato il seguente programma C:
LQFOXGHVWGLRK!
GHILQH'LP
FKDUF D
FKDU$>'LP@ ^
F
L
D
R
?
`
FKDUYHW>'LP@ ^
H
H
H
H
?
`
YRLGVXEFKDUYHW>@FKDUYHW>@
YRLGVWDPSDFKDUYHW>@
PDLQ
^VWDPSD$
VXE$YHW
VWDPSDYHW
VWDPSD$
SULQWIFF`
YRLGVXEFKDUYHW>'LP@FKDUYHW>'LP@
^LQWLFKDUF E
IRUL L'LPL
LIYHW>L@!YHW>L@
YHW>L@ YHW>L@
HOVHYHW>L@ F
`
YRLGVWDPSDFKDUYHW>@
^SULQWI9HWWRUH?Q
SULQWIVYHW
SULQWI?Q
`
Cosa viene stampato dal programma? La risposta deve essere opportunamente motivata. Si dica
inoltre se la variabile L definita nella procedura VXE è visibile dalla procedura VWDPSD e dal main.
(VHUFL]LRSXQWL
Dato un file di testo PHVLW[W, si supponga che contenga righe ciascuna contenente una stringa
(nome del mese) ed un intero (numero di giorni). Ad esempio:
JHQQDLR
IHEEUDLR
PDU]R
Si stampino a video i nomi dei mesi che hanno 31 giorni.
(VHUFL]LRSXQWL
Data la seguente funzione ricorsiva:
GRXEOHVRPPDBSRWHQ]DGRXEOHDGRXEOHEGRXEOHQ
^LIQ UHWXUQDSRZED
HOVHUHWXUQDQVRPPDBSRWHQ]DDEQ
`
Si dica se la funzione è tail ricorsiva motivando la risposta.
Si dica qual è il valore restituito dalla funzione e si disegnino i record di attivazione nel caso in cui la
funzione sia chiamata con i seguenti parametri attuali VRPPDBSRWHQ]D.
(VHUFL]LRSXQWL
Qual è la differenza tra un processo computazionale ricorsivo e uno ricorsivo tail ?
A. Il primo è molto più efficiente del secondo perché nel secondo caso vengono allocati tanti record
di attivazione quante sono le chiamate, nel primo uno solo.
B. Il secondo è molto più efficiente del primo perché nel secondo caso si può effettuare una
ottimizzazione che limita il numero di record di attivazione allocati sullo stack.
C. Nessuna differenza
62/8=,21(
(VHUFL]LR
GRXEOHIGRXEOHDLQWQ
^LIQ UHWXUQD±D
HOVHUHWXUQD±QDIDQ
`
(VHUFL]LR
La prima stampa produce i valori ciao che corrispondono al vettore $ inalterato. Dopo di che viene
chiamata la procedura VXE che modifica i valori di YHW e di $. Se l’elemento di YHW è maggiore
alfabeticamente del corrispondente elemento di $, quest'ultimo elemento viene sovrascritto
dall’elemento di YHW, altrimenti viene sovrascritto con il carattere ‘b’.
Quindi YHW diventa ebeb e questo vettore modificato. Viene poi stampato il vettore $, producendo
eeee. Poi viene stampato vet ebeb.
Infine viene stampato F, che è la variabile definita esternamente al main e non quella definita nella
procedura VXE.
Quindi, il risultato stampato è
Vettore:
ciao
Vettore:
eeee
Vettore:
ebeb
a
la variabile L definita nella procedura VXE non è visibile nella procedura VWDPSD e nel main.
(VHUFL]LR
LQFOXGHVWGLRK!
LQFOXGHVWGOLEK!
PDLQ^
LQWJLRUQL),/(I
FKDUQRPH>@
LII IRSHQPHVLW[WU 18//^
SULQWI,OILOHQRQHVLVWHH[LW`
ZKLOHIVFDQIIVG?Q QRPHJLRUQL (2)
LIJLRUQL SULQWIV?QQRPH
IFORVHI
`
(VHUFL]LR
La funzione non è tail ricorsiva, perché dopo la chiamata ricorsiva deve ancora essere calcolato il il
prodotto.
Sequenza chiamate
I!I!I
5$
'/
Q D E 5$
'/
Q D E 5$
'/
Q D E (VHUFL]LRSXQWL
La risposta corretta e’ la B.