Es posible que desee consultar el teorema maestro para encontrar la gran O de métodos recursivos. Aquí está el artículo de Wikipedia: http://en.wikipedia.org/wiki/Master_theorem
Quiere pensar en un problema recursivo como en un árbol. Luego, considere cada nivel del árbol y la cantidad de trabajo requerido. Los problemas generalmente se clasificarán en 3 categorías, raíz pesada (primera iteración >> resto del árbol), equilibrada (cada nivel tiene la misma cantidad de trabajo), hoja pesada (última iteración >> resto del árbol).
Tomando ordenamiento por mezcla como un ejemplo:
define mergeSort(list toSort):
if(length of toSort <= 1):
return toSort
list left = toSort from [0, length of toSort/2)
list right = toSort from [length of toSort/2, length of toSort)
merge(mergeSort(left), mergeSort(right))
se puede ver que cada llamada de mergesort a su vez llama más mergeSorts 2 de 1/2 de la longitud original. Sabemos que el procedimiento de fusión llevará tiempo proporcional a la cantidad de valores fusionados.
La relación de recurrencia es entonces T (n) = 2 * T (n/2) + O (n). Los dos provienen de las 2 llamadas y el n/2 es de cada llamada que tiene solo la mitad del número de elementos. Sin embargo, en cada nivel hay la misma cantidad de elementos n que deben fusionarse, por lo que el trabajo constante en cada nivel es O (n).
Sabemos que el trabajo está distribuido uniformemente (O (n) cada profundidad) y el árbol es log_2 (n) profundo, por lo que la gran O de la función recursiva es O (n * log (n)).
Esto realmente tiene poco que ver con la recursión, y todo tiene que ver con la notación O grande. Si puede escribirlo recursivamente, puede escribirlo iterativamente – MStodd
@MStodd No necesariamente. Intenta atravesar un árbol binario de forma iterativa. – Drise
@Drise Necesitarías una pila, pero es posible. Recursion solo oculta la pila dentro de la pila de llamadas. –