Предположим, у меня есть функция f, которая принимает вектор v и возвращает новый вектор с некоторыми преобразованными элементами. Это достигается путем вызова функции g, предполагающей, что вектор отсортирован. Итак, я хочу, чтобы f было определено так:
f[v_] := Module[{s, r},
s = Sort[v]; (* remember the permutation applied in order to sort v *)
r = g[s];
Unsort[r] (* apply the inverse of that permutation *)
]
Как лучше всего выполнить «Несортировку»?
Или мы могли бы по-настоящему фантазировать и заставить это как-то работать:
answer = Unsort[g[Sort[v]]];
ДОБАВЛЕНО: Давайте сделаем этот бетон с помощью игрушечный пример. Предположим, нам нужна функция f, которая принимает вектор и преобразует его, добавляя к каждому элементу следующий наименьший элемент, если таковой имеется. Это легко написать, если предположить, что вектор отсортирован, поэтому давайте напишем вспомогательную функцию g, которая делает это предположение:
g[v_] := v + Prepend[Most@v, 0]
Теперь для функции, которая нам действительно нужна, f, которая работает независимо от того, отсортирован v или нет:
f[v_] := (* remember the order;
sort it;
call g on it;
put it back in the original order;
return it
*)