如果在每次递归中保持第一个元素不变,并仅按顺序使用值创建3个组,则可以递归地执行此操作并避免重复,例如:
{1,2,3,4,5,6,7,8,9}
将最低的元素放在第一个位置(a),并保持它在那里:
{a,b,c} = {1, *, *}
对于第二个位置(b),从第二低到第二高的每个值进行迭代:
{a,b,c} = {1, 2~8, *}
对于第三个位置(c),迭代高于第二个值的每个值:
{1, 2~8, b+1~9}
然后用剩余的值进行递归。
{1,2,3} {4,5,6} {7,8,9}
{1,2,3} {4,5,7} {6,8,9}
{1,2,3} {4,5,8} {6,7,9}
{1,2,3} {4,5,9} {6,7,8}
{1,2,3} {4,6,7} {5,8,9}
{1,2,3} {4,6,8} {5,7,9}
{1,2,3} {4,6,9} {5,7,8}
{1,2,3} {4,7,8} {5,6,9}
{1,2,3} {4,7,9} {5,6,8}
{1,2,3} {4,8,9} {5,6,7}
{1,2,4} {3,5,6} {7,8,9}
...
{1,8,9} {2,6,7} {3,4,5}
当我说“按顺序”时,不必是任何特定顺序(数字,字母表...),它可以只是输入的原始顺序。如果确保按接收到它们的顺序将其余值传递给下一个递归,则可以避免重新对每次递归的输入进行排序。
递归操作的说明:
假设你得到了输入{1,2,3,4,5,6,7,8,9}。作为组中的第一个元素,您从输入中取出第一个元素,并针对其他两个元素,您迭代其他值:
{1,2,3}
{1,2,4}
{1,2,5}
{1,2,6}
{1,2,7}
{1,2,8}
{1,2,9}
{1,3,4}
{1,3,5}
{1,3,6}
...
{1,8,9}
确保第三个元素始终在第二个元素之后,以避免出现重复项,例如:
{1,3,5} ⇆ {1,5,3}
假设在某个时刻,您选择了以下作为第一组:
{1,3,7}
然后将其余值传递给下一个递归:
{2,4,5,6,8,9}
在这个递归中,应用与第一组相同的规则:将第一个元素作为组中的第一个元素并保留在那里,然后迭代其他值以获得第二个和第三个元素:
{2,4,5}
{2,4,6}
{2,4,8}
{2,4,9}
{2,5,6}
{2,5,8}
{2,5,9}
{2,6,7}
...
{2,8,9}
现在,假设您选择以下作为第二组:
{2,5,6}
然后将其余值传递给下一个递归:
{4,8,9}
由于这是最后一组,只有一种可能性,因此该特定递归将以以下组合结束:
{1,3,7} {2,5,6} {4,8,9}
正如您所看到的,您不必在任何时候对值进行排序,只要按照接收到它们的顺序将它们传递到下一个递归即可。因此,如果您收到:
{q,w,e,r,t,y,u,i,o}
并从中选择以下组:
{q,r,u}
那么您应该继续传递:
{w,e,t,y,i,o}
这里是一个演示方法的JavaScript片段;它返回一个由元素组合组成的3D数组。
(过滤函数创建了输入数组的一个副本,并删除了元素0、i和j。)
function clone2D(array) {
var clone = [];
for (var i = 0; i < array.length; i++) clone.push(array[i].slice());
return clone;
}
function groupThree(input) {
var result = [], combination = [];
group(input, 0);
return result;
function group(input, step) {
combination[step] = [input[0]];
for (var i = 1; i < input.length - 1; i++) {
combination[step][1] = input[i];
for (var j = i + 1; j < input.length; j++) {
combination[step][2] = input[j];
if (input.length > 3) {
var rest = input.filter(function(elem, index) {
return index && index != i && index != j;
});
group(rest, step + 1);
}
else result.push(clone2D(combination));
}
}
}
}
var result = groupThree([1,2,3,4,5,6,7,8,9]);
for (var r in result) document.write(JSON.stringify(result[r]) + "<br>");
{4, 7, 9}
和{1, 2, 4}
中都出现了数字4,这正常吗? - L. Meyer(3k)! / (k! * 6^k)
。 - MBo