我不知道除了使用x嵌套for循环之外如何从x组数据中获取所有可能性,我不想这样做,因为我不知道x的值,这使得数字很可能for loops的硬编码不等于所需的循环次数。
说我有:
A:1,2,3,4
B:2,4,65,2
C:1,3,2
D:2,8
我希望从每个组中获得1个项目的每个组合(在我的代码中,我使用std::vector <myclass>
),我该怎么做?有人可以发一个我可以遵循的一般伪代码吗?
答案 0 :(得分:0)
如果你不知道你有多少'团体',我认为你至少有一些所有的集合?即你所有向量的数组/向量?
如果是这样,这里有一个关于什么可行的一般概念
void iterateAllCombinations(array_of_groups, current_group_index,temp_result,callback_function)
{
current_group = array_of_groups[current_group_index]
for each element in current_group
{
temp_result[current_group_index]=element
if current_group_index>0
iterateAllCombinations(array_of_groups,current_group_index-1,temp_result,callback_function)
else
callback_function(temp_result)
}
}
this would be called in some fashion like:
iterateAllCombinations(my_groups,my_groups.length-1,new vector[my_groups.length],&do_something_with_array)
对正在发生的事情的基本解释: 当你调用该函数时,它将开始遍历'top'组中的每个项目(array_of_groups中的最后一个)。如果超出'top'的组有更多组,它将调用相同的函数,传递当前项目,并告诉它查看下一组。
下一个级别将开始浏览每个项目,并且行为方式相同。这一直持续到你到达底部组,在那里,它将把所有结果的集合传递给你将使用它们的回调函数。
当底层已经通过所有项目时,它将返回到下一级别,这仍然在其“for each”循环中。下一级别将转到下一个项目,并调用底部级别,该级别将从头开始。这种情况一直持续到最终甚至“顶级”水平都经过了每个项目。
这是伪代码,具体情况会根据您的语言而变化。 '临时结果'可以是声明和分配的前置数组(就像我在伪代码中显示的那样),或者它可以是在每次递归调用之前被推送的堆栈,然后弹出,或者它可以是数组/在每次递归调用之前复制和追加的向量。你甚至可以有一个链表,每个节点只存储在该函数调用的堆栈框架中,你只需要将'parent'的指针传递给下一级别。
如果您想要执行某项特定操作,则可以使用该特定内容替换“callback_function”。或者,如果您的语言允许,您可以将其用作迭代器/生成器,并让“回调”隐式
如果你真的讨厌递归代码,你可以编写与while循环相同的东西,但将它作为递归函数编写会更直接。