¿Cuál es la diferencia entre la optimización de llamadas de cola y la optimización de recursión de cola?

La optimización de recursión de cola es un caso especial de optimización de llamadas de cola.

Se produce una llamada de cola cuando una función, [matemática] f [/ matemática], devuelve el valor de llamar a una función [matemática] f ‘[/ matemática] sin modificaciones. (Para las funciones nulas, [math] fv [/ math], se produce una llamada de cola cuando [math] fv [/ math] regresa inmediatamente después de llamar a una función [math] fv ‘[/ math].)

La optimización de la llamada de cola reconoce que el registro de activación (marco de pila) para la función [matemática] f [/ matemática] (o [matemática] fv [/ matemática]) ya no se utiliza cuando [matemática] f ‘[/ matemática] ([math] fv ‘[/ math]) se llama y se puede desasignar inmediatamente para que la función llamada [math] f’ [/ math] ([math] fv ‘[/ math]) pueda regresar directamente a la persona que llama [matemáticas] f [/ matemáticas] (o [matemáticas] fv [/ matemáticas]). O el marco de la pila puede reutilizarse, o modificarse ligeramente para reutilizarse, en cuyo caso la llamada a la función es realmente solo un goto. En cualquier caso, recibe una llamada de función sin necesidad de agregar otro registro de activación a la pila de llamadas.

Nadie dijo que [math] f [/ math] y [math] f ‘[/ math] no pueden ser la misma función (de manera similar para las funciones nulas). Una llamada recursiva se puede optimizar exactamente de la misma manera, ¡y el registro de activación definitivamente se verá igual! Simplemente asigne los argumentos en la llamada a los parámetros en el registro de activación de la función principal y vaya al inicio de la función.

Si todas las llamadas recursivas de una función son llamadas de cola, la función es recursiva de cola y se convertirá en un bucle, ejecutándose en un espacio de pila constante.

Como era de esperar, la respuesta de Mark Sheldon a ¿Cuál es la diferencia entre la optimización de llamada de cola y la optimización de recursión de cola? está justo en Si desea ver un ejemplo concreto que depende de las llamadas de cola pero que no estaría contento con solo la recursión de cola, vea Autómatas a través de macros.

Además, tenga en cuenta que muchos de nosotros consideramos que el término “optimización” en este contexto es inapropiado. Si tiene o no llamadas de cola es una propiedad semántica : afecta el uso del espacio big-O de su programa. Si no tiene llamadas de cola, y el espacio es importante, debe volver a escribir su programa, por lo que no puede considerarse simplemente una mejora “agradable si puede obtenerlo”, como sugiere el término “optimización”.

En \ cite [\ S1, pp. 9] {Tate2014}, la definición de optimización de llamada de cola parece adherirse a la definición de optimización de recursión de cola.

Referencia:
[Tate2014] Tate, BA, Daoud, F., Dees, I. y Moffitt, J. Siete idiomas más en siete semanas: idiomas que están formando el futuro, versión P2.0 ed. Los programadores pragmáticos, Raleigh, Carolina del Norte, 2014.