除了使用x个嵌套的for循环之外,我不知道如何从x个数据集中获取所有的可能性,因为我不知道x的值,这使得硬编码的for循环的数量很可能不等于所需的循环数量。
假设我有:
A:1,2,3,4
B:2,4,65,2
C:1,3,2
D:2,8我想从每个组中获得1个项目的每个组合(在我的代码中,我使用std::vector <myclass>),我该如何做到呢?有没有人可以发布一个通用的伪代码,我可以效仿来做这个?
发布于 2011-03-17 11:01:38
如果你不知道你有多少个“组”,我想你至少有一些所有组的集合?即所有向量的数组/向量?
如果是这样的话,这里有一个大概的想法
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”循环中。下一级上一级将转到下一项,并调用最低级,这将从头开始。这会一直持续下去,直到最终即使是“顶层”也通过了每一项。
这是伪代码,具体内容根据您的语言而有所不同。“temp result”可以是预先声明和分配的数组(就像我在伪代码中显示的那样),也可以是在每次递归调用之前被推入并在之后弹出的堆栈,也可以是在每次递归调用之前复制并附加的数组/向量。你甚至可以有一个链表,每个节点只存储在该函数调用的栈帧中,你只需将“父节点”的指针传递到下一层。
如果您有一件特定的事情要做,您可以用该特定的事情替换'callback_function‘。或者,如果您的语言允许的话,您可以将其用作迭代器/生成器,并让该“回调”是隐式的
如果您真的讨厌递归代码,那么您可以编写与while循环相同的代码,但将其编写为递归函数要简单得多。
https://stackoverflow.com/questions/5334073
复制相似问题