Supponiamo di avere una funzione f che prende un vettore v e restituisce un nuovo vettore con gli elementi trasformati in qualche modo. Lo fa chiamando la funzione g che presuppone che il vettore sia ordinato. Quindi voglio f da definire in questo modo:Unsort: ricordare una permutazione e annullarla
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 *)
]
Qual è il modo migliore per fare il "Annulla l'ordinamento"?
Oppure potremmo ottenere veramente fantasia e hanno questo in qualche modo funziona:
answer = Unsort[g[Sort[v]]];
aggiunto: Facciamo questo in calcestruzzo con un esempio di giocattolo. Supponiamo di volere una funzione f che prende un vettore e lo trasforma aggiungendo a ciascun elemento l'elemento più piccolo successivo, se presente. Questo è facile da scrivere se si assume il vettore è ordinato, quindi cerchiamo di scrivere la funzione di supporto g che rende tale ipotesi:
g[v_] := v + Prepend[[email protected], 0]
Ora, per la funzione che vogliamo davvero, f, che funziona anche se non v è ordinato :
f[v_] := (* remember the order;
sort it;
call g on it;
put it back in the original order;
return it
*)
Forse è meglio passare ** g ** come parametro. –
o leggermente più efficiente, cambia l'originale in "Con [{o = Ordinamento [v]}, Parte [g [v [[o]]], Ordine [o]]]'. – Janus