Есть два очевидных способа структурирования связанного списка в Mathematica, "left":
{1, {2, {3, {4, {5, {6, {7, {}}}}}}}}
И "right":
{{{{{{{{}, 7}, 6}, 5}, 4}, 3}, 2}, 1}
Они могут быть сделаны с помощью
toLeftLL = Fold[{#2, #} &, {}, [email protected]#] & ;
toRightLL = Fold[List, {}, [email protected]#] & ;
Если я использую их и пробую ReplaceRepeated
, чтобы пройти через связанный список, я получаю радикально разные результаты Timing
:
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} *)
Почему?