Ваш вопрос довольно расплывчат, как написано, и существуют разные интерпретации "перегрузки", которые могут изменить мой ответ.Однако, если вы говорите о перегрузке своих собственных функций из-за различных типов (заголовков) и шаблонов аргументов, тогда непременно воспользуйтесь преимуществами тесно интегрированного сопоставления с образцами Mathematica.
Для обеспечения практического примененияНапример, я буду использовать это мое решение .Для справки:
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, Null}
{1.576, Null}
InОтвечая на ответ Тимо, я чувствую, что стоит поделиться моими результатами, поскольку они отличаются от его.(Я использую Mathematica 7 на Windows 7.) Кроме того, я полагаю, что он усложнил версию DownValues за пределы функции версии Switch.
Во-первых, мои настройки его функций как написаны, но с использованием диапазона значений:
Array[switchFunc2, 1*^6]; // Timing
Array[overloadFunc2, 1*^6]; // Timing
{1.014, Null}
{0.749, Null}
Так что даже как написано, функция DownValues для меня быстрее.Но второе условие не нужно:
ClearAll[overloadFunc2]
overloadFunc2[a_ /; a < 5] := 6;
overloadFunc2[a_] := 4;
Array[overloadFunc2, 1*^6]; // Timing
{0.546, Null}
Конечно, в случае такой простой функции можно также использовать If
:
ifFunc[a_] := If[a < 5, 6, 4]
Array[ifFunc, 1*^6]; // Timing
{0.593, Null}
И если это написано как чистая функция, которую Mathematica компилирует внутри Array:
ClearAll[ifFunc]
ifFunc = If[# < 5, 6, 4] &;
Array[ifFunc, 1*^6]; // Timing
{0.031, Null}