你的问题写得很模糊,对“重载”有不同的解释,这会改变我的答案。但是,如果您要针对不同类型(头)和参数模式重载自己的函数,那么一定要利用 Mathematica 紧密集成的模式匹配。
为了提供一个实际的例子,我将使用this solution of mine。供参考:
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]]])
如果我在没有模式匹配的情况下重写f 并将其命名为g:
g = Function[{k, L, c},
If[L === {},
If[Tr@c == k, {c}, {}],
Join @@ (g[k, Rest@L, Append[c, #]] & /@ Range[0, Min[First@L, k - Tr@c]])
]
];
感觉这个不太清楚,写起来肯定不太方便。我必须使用显式的Rest 和First 函数,并且我必须引入Append,因为我无法容纳可变数量的参数。这也需要使用第三个虚拟参数:{}。
时间表明原始形式也相当快:
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, 空}
{1.576, 空}
对于 Timo 的回答,我觉得分享我的计时结果很有价值,因为它们与他的不同。 (我在 Windows 7 上使用 Mathematica 7。)此外,我相信他将 DownValues 版本复杂化,超出了 Switch 版本的功能。
首先,我对他所写函数的时间安排,但使用了一系列值:
Array[switchFunc2, 1*^6]; // Timing
Array[overloadFunc2, 1*^6]; // Timing
{1.014, 空}
{0.749, 空}
因此,即使按照编写方式,DownValues 函数对我来说也更快。但不需要第二个条件:
ClearAll[overloadFunc2]
overloadFunc2[a_ /; a < 5] := 6;
overloadFunc2[a_] := 4;
Array[overloadFunc2, 1*^6]; // Timing
{0.546, 空}
当然,对于这么简单的功能,也可以使用If:
ifFunc[a_] := If[a < 5, 6, 4]
Array[ifFunc, 1*^6]; // Timing
{0.593, 空}
如果这是写成 Mathematica 在 Array 中编译的纯函数:
ClearAll[ifFunc]
ifFunc = If[# < 5, 6, 4] &;
Array[ifFunc, 1*^6]; // Timing
{0.031, 空}