2011-07-18 30 views

Respuesta

11

Dado que esta operación es lineal, no debe usarla en la parte "caliente" de su código, donde el rendimiento es importante. En una parte fría, use list @ [element] como sugiere el Adi. En una parte caliente, reescribe tu algoritmo para que no necesites hacer eso.

La forma típica de hacerlo es acumular resultados en el orden inversa durante el procesamiento, y luego invertir toda la lista acumulada antes de devolver el resultado. Si tiene N pasos de procesamiento (cada uno de ellos agrega un elemento a la lista), por lo tanto, amortiza el costo lineal del reverso sobre N elementos, por lo que mantiene un algoritmo lineal en lugar de uno cuadrático.

En algunos casos, otra técnica que funciona es procesar sus elementos en orden inversa, de modo que los resultados acumulados estén en el orden correcto sin un paso de inversión explícito.

18

La razón por la que no hay una función estándar de hacer esto es que añadiendo al final de una lista es una anti-patrón (también conocido como una "lista SNOC" o una Schlemiel the Painter algorithm). Agregar un elemento al final de una lista requiere una copia completa de la lista. Agregar un elemento en la parte delantera de la lista requiere asignar una sola celda —, la cola de la nueva lista solo puede apuntar a la lista anterior.

Dicho esto, la forma más sencilla de hacerlo es

let append_item lst a = lst @ [a] 
Cuestiones relacionadas