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 .

Descripción

Cuando se llama una función, la computadora debe " remember" el lugar fue llamado de, el remite, de modo que pueda volver a esa localización con el resultado que la llamada es una vez completa. Típicamente, esta información se ahorra en el apilado, una lista simple de localizaciones de vuelta en la orden de los tiempos que las localizaciones de la llamada que describen fueron alcanzadas. A veces, la cosa pasada que una función hace después de terminar el resto de las operaciones es llamar simplemente una función, posiblemente sí mismo, y vuelve su resultado. Pero en este caso, no hay necesidad de recordar el lugar que estamos llamando de — en lugar, podemos dejar el apilado solo, y la función nuevamente llamada volverá su resultado directo al llamador original del . Convirtiendo una llamada a una rama o a un salto en tal caso se llama una optimización de la llamada de la cola del . Observar que la llamada de la cola no tiene que aparecer léxico después de el resto de las declaraciones en el código fuente; es solamente importante que su resultado esté vuelto inmediatamente, puesto que la función que llama nunca conseguirá una ocasión de hacer cualquier cosa después de la llamada si se realiza la optimización.

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.

  • de El si el de (si el E2 del E1 del E0 ) está en la posición de la cola, después E1 y E2 está en la posición de la cola.

    Ejemplos

    Tomar este programa del esquema como ejemplo:

    lang=" del (definir (n) factorial (definir (CRNA de los fac-tiempos n) (si (= n 0) CRNA (fac-tiempos (- n 1) (* CRNA n)))) (si (< n 0) (" de la exhibición; ¡Perjudicar la discusión! ") (fac-tiempos n 1)))

    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 ningú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.

    Contra del modulo de la repetición de la cola

    El contra del modulo de la repetición de la cola del es una generalización de la repetición de la cola introducida por el David H. Pues el nombre sugiere, la única operación necesitó después de que la llamada recurrente sea el contra de un, que agrega un nuevo elemento al frente de la lista que fue devuelta. La optimización mueve esta operación dentro de la llamada recurrente creando un nodo de la lista con el elemento delantero, y pasando una referencia a este nodo como discusión.

    Por ejemplo, considerar una función que duplique una lista encadenada, descrita aquí en el C : lang=" del *duplicate de la lista (*input de la lista del const) { si (FALTA DE INFORMACIÓN del == de la entrada) { FALTA DE INFORMACIÓN de vuelta; } { *head de la lista = malloc (*head del sizeof); head->value = input->value; head->next = duplicado (input->next); cabeza de vuelta; } }

    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 *duplicate de la lista (*input de la lista del const) { *head de la lista; duplicate_prime (entrada, &head); cabeza de vuelta; } duplicate_prime vacío (*input de la lista del const, lista ** p) { si (FALTA DE INFORMACIÓN del == de la entrada) { *p = FALTA DE INFORMACIÓN; } { *p = malloc (sizeof ** p); (*p) - >value = input->value; duplicate_prime (input->next, y (*p) - >next); } }

    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 *duplicate de la lista (*input de la lista del const) { *head de la lista; lista ** p = &head; ¡mientras que (entrada! = FALTA DE INFORMACIÓN) { *p = malloc (sizeof ** p); (*p) - >value = input->value; entrada = input->next; p = y (*p) - >next; } *p = FALTA DE INFORMACIÓN; cabeza de vuelta; }

    Métodos de la puesta en práctica

    La repetición de la cola es importante para algunos idiomas de alto nivel, especialmente idiomas funcionales y los miembros balbucean familia de . En estas idiomas, la repetición de la cola es la manera más de uso general (y a veces la única manera disponible) de ejecutar de la iteración. La especificación de la lengua del esquema requiere que las operaciones cola-recurrentes deban ser optimizadas para no crecer el apilado. Las llamadas de la cola se pueden también utilizar en Perl, con una variante del " goto" declaración que toma un nombre de función: &NAME 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.

  • Zenithic
  • Malaysia FAM Cup
    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

  • © 2007-2008 enciclopediaespana.com; article text available under the terms of GFDL, from en.wikipedia.org
    ="http://pagead2.googlesyndication.com/pagead/show_ads.js">