En el de informática, la repetición de la cola del (o la repetición del cola-fin del ) es un caso especial de la repetición en el cual la operación pasada de la función es una llamada recurrente. Tales repeticiones se pueden transformar fácilmente a las iteraciones. El reemplazo de la repetición por la iteración, manualmente o automáticamente, puede disminuir drástico la cantidad de espacio del apilado usado y mejorar eficacia. Esta técnica es de uso general con las idiomas de la programación funcional, donde el acercamiento declarativo y dirección explícita del estado promueve el uso de las funciones recurrentes que llenarían de otra manera rápido la pila de llamadas .
Para el normal, las llamadas de función no recurrentes, ésta son generalmente una micro-optimización que ahorra poca hora y espacio, puesto que no hay que muchas diversas funciones disponibles llamar. Al ocuparse de funciones recurrentes o mutuamente recurrentes, sin embargo, el espacio del apilado y el número de vueltas ahorraron puede venir los granes números, puesto que una función puede llamarse, directo o indirectamente, un gran número de épocas. De hecho, reduce a menudo asintótico requisitos de espacio del apilado de linear, o O (n), al constante, o al O (1).
Si varias funciones son el mutuamente recurrente, significando ellas cada llamada una otra, y cada llamada hacen a una otra en aplicaciones de una secuencia de la ejecución una llamada de la cola, después la optimización de la llamada de la cola dará un ata correctamente la puesta en práctica recurrente de que no consume el espacio del apilado. La optimización apropiada de la repetición de la cola es requerida por las definiciones estándar de algunos lenguajes de programación, tales como esquema .
La noción de la posición de la cola en esquema puede ser definida como sigue: el
el cuerpo de una expresión de la lambda está en la posición de la cola.
lang=" del
Como usted puede ver, el procedimiento interno fac-times se llama pasado en el flujo de control. Esto permite que un intérprete o el recopilador reorganice la ejecución que parecería ordinariamente esto:
llamada (3) factorial fac-tiempos de la llamada (3 1) fac-tiempos de la llamada (2 3) fac-tiempos de la llamada (1 6) fac-tiempos de la llamada (0 6) vuelta 6 vuelta 6 vuelta 6 vuelta 6 vuelta 6
en la más variante eficiente del espacio (y time-):
llamada (3) factorial substituir las discusiones por (3 1), salta al " fac-times" substituir las discusiones por (2 3), salta al " fac-times" substituir las discusiones por (1 6), salta al " fac-times" substituir las discusiones por (0 6), salta al " fac-times" vuelta 6
Esta reorganización ahorra el espacio porque ninguÌn estado a excepción de la dirección de la función que llama necesita ser ahorrado, en el apilado o en el montón. Esto también significa que el programador no necesita preocuparse del funcionamiento del espacio del apilado o del montón para las repeticiones extremadamente profundas.
Algunos programadores que trabajan en idiomas funcionales reescribirán código recurrente para ser cola-recurrentes así que pueden aprovecharse de esta característica. Esto requiere a menudo la adición de un " accumulator" discusión (acc en el ejemplo antedicho) a la función. ¡En algunos casos (por ejemplo listas de filtración) y en algunas idiomas, la repetición completa de la cola puede requerir una función que era previamente puramente funcional ser escrita tales que transforma las referencias almacenadas en el otro variables.
Además de eficacia del espacio y de la ejecución, la optimización de la repetición de la cola es importante en el idioma de la programación funcional conocido como continuación que pasa el estilo (CPS), que funcionaría de otra manera rápidamente de espacio del apilado.
Por ejemplo, considerar una función que duplique una lista encadenada, descrita aquí en el C : lang=" del
En esta forma la función no es cola-recurrente, porque el control vuelve al llamador después de la llamada recurrente para fijar el valor de head->next. Pero en la reasunción, el llamador prepends simplemente un valor al resultado del callee. La función es tan cola-recurrente, excepto para un " cons" la acción, es decir, ata contra recurrente del modulo. El método de Warren da la puesta en práctica puramente cola-recurrente siguiente:
lang=" del
Nota cómo el callee ahora añade al extremo de la lista, algo que el llamador prepend al principio.
La puesta en práctica correctamente cola-recurrente se puede convertir a la forma iterativa: lang=" del
goto; Puesto que muchos recopiladores del esquema utilizan el C como código intermedio de la blanco, el problema baja a la repetición de la cola de la codificación en C sin el crecimiento del apilado. Muchas puestas en práctica alcanzan esto usando un dispositivo conocido como trampolín, un pedazo de código que llame en varias ocasiones funciones. Todas las funciones se incorporan vía el trampolín. Cuando una función tiene que llamar otra, en vez de llamárlela vuelve directo la dirección de la función que se llamará, las discusiones que se utilizarán, y así sucesivamente, al trampolín. Esto se asegura de que el apilado de C no crezca e iteración puede continuar indefinidamente.
Usar un trampolín para todas las llamadas de función es algo más costosa que la llamada de función del normal C, tan por lo menos un recopilador del esquema, pollo, aplicaciones que una técnica primero describió por el panadero de Henry de una sugerencia inédita por el Andrew Appel, en el cual C  normal; se utilizan las llamadas pero el tamaño del apilado se comprueba antes de cada llamada. Cuando el apilado alcanza su tamaño permitido máximo, los objetos en el apilado basura-son recogidos usar el algoritmo de Cheney trasladándose todo los datos vivos a un montón separado. Después de esto, se desenrolla el apilado (" popped") y el programa reasume del estado ahorrado momentos antes de la colección de basura. El panadero dice el " El método de Appel evita hacer una gran cantidad de pequeñas despedidas del trampolín de vez en cuando saltando del estado Building.
| Random links: | Salón de la fama y museo de la música country | Tazón de fuente de la libertad | Hilanderos de Lowell | Cyril Joe Barton | Juan Brodie |