Algorithm 返回多个变量的所有可能组合集的伪代码或C#算法

Algorithm 返回多个变量的所有可能组合集的伪代码或C#算法,algorithm,set,combinations,Algorithm,Set,Combinations,我有3个变量和一些可能的值。 例如: Var1 - possible values: 1,2,3 Var2 - possible values: a, b, c var3 - possible values: false, true 您能帮助我们找到一种返回所有可能组合的方法吗 结果可能是:  1,a,false  1,a,true,  1,b,false  1,b,true,  1,c,false  1,c,true  2,a,false 

我有3个变量和一些可能的值。 例如:

Var1 - possible values: 1,2,3
Var2 - possible values: a, b, c 
var3 - possible values: false, true
您能帮助我们找到一种返回所有可能组合的方法吗

结果可能是:

   1,a,false
   1,a,true,
   1,b,false
   1,b,true,
   1,c,false
   1,c,true
   2,a,false
   2,a,true
   2,b,false
   Etc..

我希望该算法可以应用于任何级别的组合,例如,使用其他可能值处理4或5个变量的算法。

假设每个变量都有一个与is关联的集合或向量。即: set1=[1,2,3] set2=[a,b,c] set3=[F,T]

然后,一种方法是在嵌套的“for”循环中循环这些集合。假设您的输出结构是一个由3个元素组成的列表。也就是说,所需的输出如下所示: [1,a,F],[1,a,T],[1,b,F],…] 还假设(像在Python中)可以使用“append”这样的函数将一个2元素列表附加到大列表中。然后试试这个:

myList = []  #empty list
for i in set1:
  for j in set2:
    for k in set3:
      myList.append([i, j, k])  #Appends 3-element list to big list

您可能需要在append语句中执行deepcopy,以便在每次运行迭代时不会更新主列表中的所有i、j和k。这可能不是最有效的,但我认为它相对简单。

最简单的解决方案是有n个嵌套循环:

for each possible value v1 in var1
    for each possible value v2 in var2
        for each possible value v3 in var3
            print(v1,v2,v3);
        end for v3
    end for v2
end for v1
在更一般的情况下,假设您有一个列表,其中包含n个列表(每个var一个),并且每个列表都包含每个变量的可能值。您可以通过以下递归函数的所有组合来解决这个问题

list_of_lists=[[1...][a...][false...]];
current_comb=[];

all_combinations(list_of_lists,current_comb);

function all_combinations(list_of_lists,current_comb)
    if (list_of_lists=[])
        print(current_comb);
        return;
    end if
    current_list=list_of_lists[0];
    remaining_lists=list_of_lists[1:end];
    for each v in current_list
        tmp=current_comb;tmp.Append(v);
        all_combinations(remaining_lists,tmp);
    end for v

当然,在添加变量时,很快您将需要处理组合爆炸。

看起来您正在尝试枚举。假设您的项目位于列表的列表中,则伪代码中的递归函数将执行以下操作:

enumerate_cartesian_prducts(list_of_lists):

    if list_of_lists is empty:
        return [[]]

    this_list = list_of_lists[0]
    other_lists = list_of_lists[1: ]
    other_cartesian_products = []
    return [(e + other_cartesian_product) \
        for e in this_list and other_cartesian_product in other_cartesian_products]

请注意,在大多数语言中,最后一行可能是一个双循环:它迭代第一个列表中的所有元素,以及其余部分笛卡尔乘积中的所有列表,并创建所有附加结果的列表。

唯一干净的解决方案是:

有一个函数mix(a,B),它接受两个列表并返回一个列表。那是微不足道的

您的最终代码如下所示:

result = null
result = mix( result, one of your lists );
result = mix( result, another of your lists );
result = mix( result, yet another of your lists );
result = mix( result, yet another list );
result = mix( result, one more list );
混合料示例(A、B)


你真的应该去别处找,这不是一个好问题。这是一个家庭作业,如果你使用合适的术语搜索更多的内容,已经有了一个算法

事实上,这很简单,如果你推广生成二进制字符串中所有数字组合的算法,你应该能够得到:

0 0 0 0 
0 0 0 1
0 0 1 0
0 0 1 1
0 1 0 0
0 1 0 1
0 1 1 0
0 1 1 1
1 0 0 0 
1 0 0 1
1 0 1 0
1 0 1 1
1 1 0 0
1 1 0 1
1 1 1 0
1 1 1 1
请注意,最右边的列每隔一个单元格交替其值,而右边的第二列每隔2个单元格交替其值,右边的下一列每隔4个单元格交替其值,最后一个数字每隔8个单元格交替其值

对于您的情况,请将上述情况视为当您的集合为:

Var1 - possible values: 0,1
Var2 - possible values: 0,1
Var3 - possible values: 0,1
Var4 - possible values: 0,1
启动一个计数器,跟踪你在每一组中的位置,在将“下一个从右开始”设置为1之前,在“最右边”设置中循环一整段时间。继续以这种方式循环集合,当集合“右侧”循环时碰撞集合,直到在“最重要位置”完成集合循环。您将在集合中生成所有可能的组合


其他答案都集中在“给密码”,这真的只是奖励你在这里张贴你的家庭作业问题。。。所以我想我至少应该解释一下。

在JavaScript中有一个类似伪代码的东西。(我从未用C语言编写过代码,也许我会尝试转换它。)

var集=[[1,2,3],“a”,“b”,“c”],[false,true],
结果=[];
功能f(arr,i){
if(i==sets.length){
结果:推送(arr);
返回;
}

对于(var j=0;jWhy pseudo code?根据您使用的技术,将有不同的解决方案/技术来解决此问题?例如,我可以在
T-SQL
中轻松解决此问题,只需几行代码,但在
JavaScript
中就不那么容易了。我正在使用内部代码的内部bpm平台中工作(主要喜欢excel语法)。但是用C语言也很好。我可以做一点C应用程序来满足我的目的。thx!当然。SQL伪代码:
SELECT*FROM Var1,Var2,Var3
。这很简单。:-(当然希望他们能为这类问题尝试一场高尔夫比赛。)它的可能复制再简单不过了,只要使用递归就可以了。我认为OP想要一个解决方案,当要组合的集合数在运行时之前不知道时,它就可以工作。
Var1 - possible values: 0,1
Var2 - possible values: 0,1
Var3 - possible values: 0,1
Var4 - possible values: 0,1