Câu hỏi của bạn khá mơ hồ như được viết và có các cách diễn giải khác nhau về "quá tải" sẽ thay đổi câu trả lời của tôi. Tuy nhiên, nếu bạn đang nói về việc quá tải các chức năng của riêng bạn liên quan đến các kiểu khác nhau (đầu) và các mẫu đối số, thì bằng mọi cách, hãy tận dụng lợi thế của việc khớp mẫu tích hợp chặt chẽ của Mathematica.
Để cung cấp ví dụ thực tế, tôi sẽ sử dụng this solution of mine. Để tham khảo:
f[k_, {}, c__] := If[Plus[c] == k, {{c}}, {}]
f[k_, {x_, r___}, c___] := Join @@ (f[k, {r}, c, #] & /@ Range[0, Min[x, k - Plus[c]]])
Nếu tôi viết lại f
mà không phù hợp với mô hình và gọi nó là g
:
g = Function[{k, L, c},
If[L === {},
If[[email protected] == k, {c}, {}],
Join @@ (g[k, [email protected], Append[c, #]] & /@ Range[0, Min[[email protected], k - [email protected]]])
]
];
tôi cảm thấy rằng đây là chưa rõ ràng, và nó chắc chắn ít là thuận tiện để viết. Tôi đã phải sử dụng các hàm Rest
và First
rõ ràng và tôi phải giới thiệu Append
vì tôi không thể chứa số lượng đối số thay đổi. Điều này cũng đòi hỏi một đối số thứ ba giả sử dụng: {}
.
Thời gian hiển thị rằng hình thức ban đầu cũng là nhanh hơn đáng kể:
f[12, {1, 5, 8, 10, 9, 9, 4, 10, 8}]; // Timing
g[12, {1, 5, 8, 10, 9, 9, 4, 10, 8}, {}]; // Timing
{0.951, Null}
{1.576, Null}
Đáp lại câu trả lời Timo, tôi cảm thấy nó có giá trị để chia sẻ kết quả thời gian của tôi, như chúng khác với anh. (Tôi đang sử dụng Mathematica 7 trên Windows 7.) Hơn nữa, tôi tin rằng anh ta phức tạp phiên bản DownValues ngoài chức năng của phiên bản Switch.
Thứ nhất, timings của tôi về các chức năng của mình như là bằng văn bản, nhưng sử dụng một loạt các giá trị:
Array[switchFunc2, 1*^6]; // Timing
Array[overloadFunc2, 1*^6]; // Timing
{1.014, Null}
{0.749, Null}
Vì vậy, ngay cả khi viết, các DownValues chức năng là nhanh hơn đối với tôi.Nhưng điều kiện thứ hai là không cần thiết:
ClearAll[overloadFunc2]
overloadFunc2[a_ /; a < 5] := 6;
overloadFunc2[a_] := 4;
Array[overloadFunc2, 1*^6]; // Timing
{0.546, Null}
Tất nhiên, trong trường hợp của một hàm đơn giản như người ta cũng có thể sử dụng If
:
ifFunc[a_] := If[a < 5, 6, 4]
Array[ifFunc, 1*^6]; // Timing
{0.593, Null}
Và nếu điều này được viết như một hàm thuần túy mà Mathematica biên dịch bên trong Array:
ClearAll[ifFunc]
ifFunc = If[# < 5, 6, 4] &;
Array[ifFunc, 1*^6]; // Timing
{0.031, Null}
Tôi cảm thấy rằng bạn nên thêm chi tiết hơn một chút vào câu hỏi của mình. Nó là cực kỳ rộng vào thời điểm này. –
Không thể nói rằng tôi không đồng ý với đánh giá của bạn. Ban đầu tôi đã viết nhiều hơn, nhưng nhận ra rằng tôi đã phục hồi những điều cơ bản mà hầu hết chúng ta biết từ trải nghiệm thủ công và cá nhân. Tôi sẽ cố gắng và làm rõ nếu tôi có thể --- nhưng sau khi da gấu trò chơi. :) – telefunkenvf14
Tôi cũng đã viết một câu trả lời dài hơn, và sau đó nhận ra rằng các ví dụ của tôi bị cấm, vì vậy tôi đã để nó như vậy. Thưởng thức các trò chơi. –