Anàlisi de l'eficiència d'algorismes recursius
En aquesta lliçó, explorarem com analitzar l'eficiència dels algorismes recursius utilitzant relacions de recurrència. Aquest enfocament ens permet expressar el temps d'execució d'un algorisme en funció del temps d'execució de les seves crides recursives, facilitant així la comprensió del seu comportament asimptòtic.
Exemple 1
Els algorismes recursius sovint es poden analitzar mitjançant relacions de recurrència. Aquestes relacions expressen el temps d'execució d'un algorisme en funció del temps d'execució de les seves crides recursives.
Considereu aquest algorisme recursiu on el cost de la funció g és constant:
def f(n: int) -> None:
if n > 0:
g() # cost O(1)
f(n - 1)Per trobar el temps d'execució d'aquest algorisme, definim primer que f(n).
Per tant, podem establir la següent relació de recurrència:
El cas base és quan if n > 0, es passen els paràmetres i es realitzen altres operacions.
Per al cas recursiu, quan g() (que és f(n - 1) que, pel què hem definit és
Substituïm la relació de manera iterativa:
Per tant, el temps d'execució d'aquest algorisme recursiu és
Exemple 2
Considereu ara aquest algorisme recursiu on el cost de la funció g(n) és lineal i cada cop es crida amb una entrada de mida reduïda per la meitat:
def f(n: int) -> None:
if n > 0:
g(n) # cost O(n)
f(n // 2)De nou, definim que f(n) i extraiem la relació de recurrència:
De fet, com que per a qualsevol valor constant, el temps d'execució és contant, molts cops ni tan sols es fa explícit el cas base en les relacions de recurrència:
Fixeu-vos que els arrondiments es poden eliminar per simplicitat, ja que no tenen efecte en la notació asimptòtica.
Aquest cop, per trobar una fórmula tancada per a
Per una banda,
Per altra banda,
Fent la difenència entre les dues expressions, obtenim:
Exemple 3
Considereu ara aquest algorisme recursiu on el cost de la funció g(n) és lineal i cada cop es fan dues crides recursives amb entrades de mida reduïda per la meitat:
def f(n: int) -> None:
if n > 0:
g(n) # cost O(n)
f(n // 2)
f(n // 2)De nou, definim que f(n) i extraiem la relació de recurrència:
Aquest cop, per trobar una fórmula tancada per a
Exercicis
- Calculeu el temps d'execució de l'algorisme recursiu següent:
def f(n: int) -> None:
if n > 0:
g(n) # cost O(n)
f(n - 1)- Calculeu el temps d'execució de l'algorisme recursiu següent:
def f(n: int) -> None:
if n > 0:
g(n) # cost O(n)
f(n - 1)
f(n - 1)Teorema mestre
Hi ha una eina molt útil per resoldre relacions de recurrència anomenada Teorema Mestre. De moment no l'explico, que es veu a AP2.

Jordi Petit
Lliçons.jutge.org
© Universitat Politècnica de Catalunya, 2025
