假设我有一个函数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 *)
]
Run Code Online (Sandbox Code Playgroud)
做"Unsort"的最佳方法是什么?
或者我们是否真的很喜欢并且以某种方式工作:
answer = Unsort[g[Sort[v]]];
Run Code Online (Sandbox Code Playgroud)
补充:让我们以玩具为例来具体化.假设我们想要一个带有向量的函数f,并通过向每个元素添加下一个最小元素(如果有的话)来对其进行转换.如果我们假设向量已经排序,那么这很容易编写,所以让我们编写一个辅助函数g来做出这样的假设:
g[v_] := v + Prepend[Most@v, 0]
Run Code Online (Sandbox Code Playgroud)
现在对于我们真正想要的函数f,无论v是否有效,它都有效:
f[v_] := (* remember the order;
sort it;
call g on it;
put it back in the original order;
return it
*)
Run Code Online (Sandbox Code Playgroud)