Возможно, в Mathematica есть встроенная функция или более быстрый и быстрый способ сделать это
func[l_, g_, f_] := g @@ f @@@ Transpose[{Most[l], Rest[l]}]
, который можно использовать для таких вещей
l = {a, b, c, d}
func[l, Plus, (#1 - #2)^2 &]
Я не знаю подходящего имени для такого рода функций. Что-то в жанре сгиба-молнии.
UPDATE
Много решений. Спасибо всем.
Использование
Partition[l, 2, 1]
вместо
Transpose[{Most[l], Rest[l]}]
определенно проясняет.
Я пытался запустить тайминги для функций, но получаю странные результаты:
func1[l_, g_, f_] := g @@ f @@@ Transpose[{Most[l], Rest[l]}]
func2[l_, g_, f_] := g @@ f @@@ Partition[l, 2, 1]
func3[l_, g_, f_] := g @@ ListConvolve[{1, 1}, l, {-1, 1}, {}, Times, f]
func4[l_, g_, f_] := g @@ Thread[f[Most@l, Rest@l]]
func5[l_, g_, f_] := g @@ f /@ Partition[l, 2, 1]
func6[l_, g_, f_] := g @@ Thread[f[Most[l], Rest[l]]]
func7[l_, f_, g_] := Inner[f, Sequence @@ Partition[l, Length[l] - 1, 1], g]
func8[l_, g_, f_] := g @@ MapThread[f, Partition[l, Length[l] - 1, 1]]
functions = {func1, func2, func3, func4, func5, func6, func7, func8}
input = Table[ToExpression["x" <> ToString[i]], {i, 1, 1000000}];
inputs = Table[Take[input, i*100000], {i, 1, 10}];
Table[
If[i == j == 0, "",
If[j == 0, functions[[i]],
If[i == 0, Length[inputs[[j]]],
Timing[functions[[i]][inputs[[j]]]][[1]]]]],
{i, 0, Length[functions]}, {j, 0, Length[inputs]}] // Transpose // TableForm