Giả sử tôi có hàm f lấy vectơ v và trả về một vectơ mới với các phần tử được biến đổi theo một cách nào đó. Nó thực hiện điều đó bằng cách gọi hàm g giả sử rằng vectơ được sắp xếp. Vì vậy, tôi muốn f được xác định như vậy:Unsort: ghi nhớ hoán vị và hoàn tác nó
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 *)
]
Cách tốt nhất để thực hiện "Bỏ nhóm" là gì?
Hoặc chúng ta có thể có được thực sự ưa thích và có điều này bằng cách nào đó làm việc:
answer = Unsort[g[Sort[v]]];
thêm: Hãy làm cho bê tông này với một ví dụ đồ chơi. Giả sử chúng ta muốn hàm f lấy một vector và biến đổi nó bằng cách thêm vào từng phần tử thành phần nhỏ nhất tiếp theo, nếu có. Đó là dễ dàng để viết nếu chúng ta giả định các vector được sắp xếp, vì vậy chúng ta hãy viết một hàm helper g mà làm cho rằng giả định:
g[v_] := v + Prepend[[email protected], 0]
Bây giờ cho các chức năng chúng tôi thực sự muốn, f, mà làm việc hay không v được sắp xếp :
f[v_] := (* remember the order;
sort it;
call g on it;
put it back in the original order;
return it
*)
Có lẽ nó tốt hơn để vượt qua ** g ** như một tham số. –
hoặc hiệu quả hơn một chút, thay đổi ban đầu thành 'Với [{o = Đặt hàng [v]}, Phần [g [v [[o]]]], Đặt hàng [o]]]'. – Janus