Conozco el concepto general de recursión. Encontré el concepto de recursión de la cola mientras estudiaba el algoritmo de clasificación rápida. En este video del algoritmo de clasificación rápida del MIT a las 18:30 segundos, el profesor dice que este es un algoritmo recursivo de cola. No me queda claro qué significa realmente la recursión de la cola.
¿Alguien puede explicar el concepto con un ejemplo adecuado?
Algunas respuestas proporcionadas por la comunidad SO aquí .
Respuestas:
La recursividad de cola es un caso especial de recursión donde la función de llamada no realiza más cálculos después de hacer una llamada recursiva. Por ejemplo, la función
es recursiva de cola (ya que la instrucción final es una llamada recursiva) mientras que esta función no es recursiva de cola:
ya que hace algunos cálculos después de que la llamada recursiva ha regresado.
La recursividad de la cola es importante porque se puede implementar de manera más eficiente que la recursividad general. Cuando hacemos una llamada recursiva normal, tenemos que insertar la dirección de retorno en la pila de llamadas y luego saltar a la función llamada. Esto significa que necesitamos una pila de llamadas cuyo tamaño es lineal en la profundidad de las llamadas recursivas. Cuando tenemos una recursividad de cola, sabemos que tan pronto como regresemos de la llamada recursiva, también regresaremos de inmediato, para que podamos omitir toda la cadena de funciones recursivas que regresan y regresar directamente a la persona que llama original. Eso significa que no necesitamos una pila de llamadas para todas las llamadas recursivas, y podemos implementar la llamada final como un simple salto, lo que nos ahorra espacio.
fuente
def recurse(x): if x < 0 return 1; for i in range 100{ (do calculations) recurse(x)}
Simplemente dicho, la recursión de cola es una recursión en la que el compilador podría reemplazar la llamada recursiva con un comando "goto", por lo que la versión compilada no tendrá que aumentar la profundidad de la pila.
A veces, diseñar una función recursiva de cola requiere que necesite crear una función auxiliar con parámetros adicionales.
Por ejemplo, esta no es una función recursiva de cola:
Pero esta es una función recursiva de cola:
porque el compilador podría reescribir la función recursiva a una no recursiva, usando algo como esto (un pseudocódigo):
La regla para el compilador es muy simple: cuando encuentre "
return thisfunction(newparameters);
", reemplácelo con "parameters = newparameters; goto start;
". Pero esto solo se puede hacer si el valor devuelto por la llamada recursiva se devuelve directamente.Si todas las llamadas recursivas en una función se pueden reemplazar de esta manera, entonces es una función recursiva de cola.
fuente
Mi respuesta se basa en la explicación dada en el libro Estructura e interpretación de programas de computadora . Recomiendo este libro a los científicos informáticos.
Enfoque A: proceso recursivo lineal
La forma del proceso para el Enfoque A se ve así:
Enfoque B: proceso iterativo lineal
La forma del proceso para el Enfoque B se ve así:
El proceso iterativo lineal (enfoque B) se ejecuta en un espacio constante a pesar de que el proceso es un procedimiento recursivo. También debe tenerse en cuenta que, en este enfoque, un conjunto de variables define el estado del proceso en cualquier punto, a saber.
{product, counter, max-count}
. Esta es también una técnica mediante la cual la recursividad de cola permite la optimización del compilador.En el Enfoque A, hay más información oculta que el intérprete mantiene, que es básicamente la cadena de operaciones diferidas.
fuente
La recursividad de cola es una forma de recursión en la que las llamadas recursivas son las últimas instrucciones de la función (de ahí proviene la parte de cola). Además, la llamada recursiva no debe estar compuesta con referencias a celdas de memoria que almacenen valores anteriores (referencias distintas de los parámetros de la función). De esta manera, no nos importan los valores anteriores y un marco de pila es suficiente para todas las llamadas recursivas; la recursividad de cola es una forma de optimizar algoritmos recursivos. La otra ventaja / optimización es que hay una manera fácil de transformar un algoritmo recursivo de cola a uno equivalente que usa iteración en lugar de recursividad. Entonces sí, el algoritmo para quicksort es realmente recursivo.
Aquí está la versión iterativa:
fuente