Hay dos maneras obvias para estructurar una lista enlazada en Mathematica, "izquierda":izquierda versus lista de Derecho vinculado, Reemplazar velocidad
{1, {2, {3, {4, {5, {6, {7, {}}}}}}}}
y "derecha":
{{{{{{{{}, 7}, 6}, 5}, 4}, 3}, 2}, 1}
Estos se pueden hecha con:
toLeftLL = Fold[{#2, #} &, {}, [email protected]#] & ;
toRightLL = Fold[List, {}, [email protected]#] & ;
Si utilizo estos, y hago un simple ReplaceRepeated
a caminar a través de la lista enlazada, que recibo drasti camente diferentes Timing
resultados:
r = Range[15000];
left = [email protected];
right = [email protected];
Timing[i = 0; left //. {head_, tail_} :> (i++; tail); i]
Timing[i = 0; right //. {tail_, head_} :> (i++; tail); i]
(* Out[6]= {0.016, 15000} *)
(* Out[7]= {5.437, 15000} *)
¿Por qué?
supongo que puede ser más rápido debido a la optimización de llamada de cola. – Andrey
Marque este: http://stackoverflow.com/questions/4481301/tail-call-optimization-in-mathematica – Andrey
@Mr. Wizard: ¿Podrías desglosar el RHS de tu 'RuleDelayed'? Aunque creo, como que veo cómo se ve en la lista, no está del todo claro. Además, si reemplazo 'tail' en el RHS con' tail-tail + tail', obtengo un error: '$ RecursionLimit :: reclim: Recursion depth of 256 excedido. >> 'y necesidad de abortar. ¿Por qué MMA no averigua que 'tail-tail + tail = tail' y devuelve el mismo resultado que antes? – abcd