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.