====== Soluzioni del compito del 9/7/2008 ====== Soluzione per gli esercizi 2, 3 e 5 ===Esercizio 2=== Il testo chiede di determinare l'output del seguente programma Python: def f(x,y): return x+y*2 def g(x,y=[1]): return x>y a=[1,2] b=['a','b'] print g(f(a,b)) print f(b,a) print g(f(a,b),f(b,a)) def h(y): def f(x): return x+y return f f=h(a) print f(b) La risposta corretta e': True ['a', 'b', 1, 2, 1, 2] False ['a', 'b', 1, 2] Bisogna infatti ricordare che l'operazione di confronto si applica fra liste di qualunque lunghezza, e l'operatore * applicato ad una lista ed un numero intero //n// restituisce una nuova lista pari alla lista originale replicata //n// volte. Per seconda parte, la funzione //f=h(x)// esegue la somma (o la concatenazione, nel caso delle liste) fra //x// e l'argomento di //f//. ===Esercizio 3=== Gli ultimi due casi si risolvono applicando il teorema maestro. Il primo si svolge considerando che T(n) = T(n-3) + lg n = lg n + lg n-3 + lg n-6 ... = Θ(n lg n). ===Esercizio 5=== Se l'albero, per essere valido, deve avere in ogni nodo un'etichetta pari alla somma delle etichette nei sottoalberi, allora e' anche vero che in ogni nodo l'etichetta deve essere pari al //doppio// della somma delle etichette dei figli (a meno che i figli non siano foglie). Di conseguenza, si puo' scrivere una soluzione (in Python) in questo modo: def check(node): if node.isLeaf() : return True sum = 0 for c in node.children : if c.isLeaf() : sum+=c.value else : sum+=c.value*2 if sum != node.value : return False return reduce(lambda x, y: x and y, [ check(c) for c in node.children ], 1) La complessita' di questa soluzione e' O(n) nel numero dei nodi.