Wolfram mathematica Mathematica中的下料变量
所以我对Mathematica还很陌生,我正在努力学习用函数的方式解决问题。我要解决的问题是列出我可以对列表中的元素求和的方法(有重复),所以求和是leq到某个值。下面的代码很好地解决了这个问题Wolfram mathematica Mathematica中的下料变量,wolfram-mathematica,Wolfram Mathematica,所以我对Mathematica还很陌生,我正在努力学习用函数的方式解决问题。我要解决的问题是列出我可以对列表中的元素求和的方法(有重复),所以求和是leq到某个值。下面的代码很好地解决了这个问题 i = {7.25, 7.75, 15, 19, 22}; m = 22; getSum[l_List, n_List] := Total[Thread[{l, n}] /. {x_, y_} -> x y]; t = Prepend[Map[Range[0, Floor[m/#]] &,
i = {7.25, 7.75, 15, 19, 22};
m = 22;
getSum[l_List, n_List] := Total[Thread[{l, n}] /. {x_, y_} -> x y];
t = Prepend[Map[Range[0, Floor[m/#]] &, i], List];
Outer @@ %;
Flatten[%, ArrayDepth[%] - 2];
Map[{#, getSum[i, #]} &, %];
DeleteCases[%, {_, x_} /; x > m || x == 0];
TableForm[Flatten /@ SortBy[%, Last], 0,
TableHeadings -> {None, Append[i, "Total"]}]
然而,代码检查了很多不必要的情况,如果列表中m越高,则可能会出现问题。我的问题很简单,在效率和代码优雅方面,解决这个问题最像数学的方法是什么 一个简单但不是最佳的方法是:
sol = Reduce[Dot[i, {a, b, c, d, e}] <= m, {a, b, c, d, e}, Integers];
怎么样
recurr[numbers_, boundary_] :=
Reap[memoryRecurr[0, {}, numbers, boundary]][[2, 1]];
memoryRecurr[_, _, {}, _] := Null;
memoryRecurr[sum_, numbers_, restNumbers_, diff_] :=
(
Block[
{presentNumber = First[restNumbers], restRest = Rest[restNumbers]}
,
If[
presentNumber <= diff
,
Block[{
newNumbers = Append[numbers, presentNumber],
newSum = sum + presentNumber
},
Sow[{newNumbers, newSum}];
memoryRecurr[
newSum,
newNumbers,
restRest,
diff - presentNumber
];
]
];
memoryRecurr[sum, numbers, restRest, diff]
];
);
->
我想投赞成票,但你的总代表现在看起来比加10好得多。@HighPerformanceMark我必须同意,我会接受精神上的支持。代码确实非常简洁!然而,与我的解决方案相比,它似乎非常慢,这正是我想要改进的!啊,其他人破坏了你代表的优雅,所以我现在投票。在这里和Mathematica.StackExchange上交叉张贴没有多大意义-两个地方的大多数人都是相同的,只有我们中的大多数人切换到了那个。
recurr[numbers_, boundary_] :=
Reap[memoryRecurr[0, {}, numbers, boundary]][[2, 1]];
memoryRecurr[_, _, {}, _] := Null;
memoryRecurr[sum_, numbers_, restNumbers_, diff_] :=
(
Block[
{presentNumber = First[restNumbers], restRest = Rest[restNumbers]}
,
If[
presentNumber <= diff
,
Block[{
newNumbers = Append[numbers, presentNumber],
newSum = sum + presentNumber
},
Sow[{newNumbers, newSum}];
memoryRecurr[
newSum,
newNumbers,
restRest,
diff - presentNumber
];
]
];
memoryRecurr[sum, numbers, restRest, diff]
];
);
recurr[{1, 2, 3, 4, 5}, 7]
{{{1}, 1}, {{1, 2}, 3}, {{1, 2, 3}, 6}, {{1, 2, 4}, 7}, {{1, 3},
4}, {{1, 4}, 5}, {{1, 5}, 6}, {{2}, 2}, {{2, 3}, 5}, {{2, 4},
6}, {{2, 5}, 7}, {{3}, 3}, {{3, 4}, 7}, {{4}, 4}, {{5}, 5}}