Le equazioni di ricorrenza esprimono la complessità temporale degli algoritmi ricorsivi. Non si può calcolare normalmente la complessità di questi algoritmi dato che la loro funzione di costo computazionale è anch’essa ricorsiva.

Esempio:

def ricercaR(x, A, i=0):
	if len(A) == i:
		return None
	if A[i] == x:
		return i
	else:
		return ricercaR(x, A, i+1)

Equazione di complessità

Metodi di risoluzione

Esempi di equazioni di ricorrenza a partire da programmi

Esempio con il fattoriale

def fattoriale(n):
	if n==0: # caso base
		return 1
	return n * fattoriale(n-1) # passo ricorsivo
  • Il tempo dipende da :
  • Il caso base costa e si calcola con le classiche regole della complessità temporale
  • Il caso ricorsivo costa

Risolvendo l’equazione di ricorrenza, la complessità del programma risulta .

Esempio con la somma delle liste

def somma(A):
    if not len(A):
		return 0
	return A[0] + somma(A[1:])

Il è dovuto allo slicing nel passo ricorsivo.

Ottimizzazione

Dato che la complessità del passo ricorsivo è dovuto allo slicing della lista, per ottimizzare l’algoritmo basta passare sempre la lista originare alla chiamata ricorsiva, ma incrementando l’indice a ogni iterazione.

def somma(A, i=0):
    if A == i:
		return 0
	return A[i] + somma(A, i+1)