====== 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.