Предположим, у меня есть функция 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 *)
]
Какой лучший способ сделать "Unsort"?
Или мы могли бы по-настоящему придумать и заставить это как-то работать:
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
*)