首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何从多个树中获取所有组合?

如何从多个树中获取所有组合?
EN

Stack Overflow用户
提问于 2011-03-17 10:08:42
回答 1查看 383关注 0票数 0

除了使用x个嵌套的for循环之外,我不知道如何从x个数据集中获取所有的可能性,因为我不知道x的值,这使得硬编码的for循环的数量很可能不等于所需的循环数量。

假设我有:

代码语言:javascript
运行
复制
A:1,2,3,4
B:2,4,65,2
C:1,3,2
D:2,8

我想从每个组中获得1个项目的每个组合(在我的代码中,我使用std::vector <myclass>),我该如何做到呢?有没有人可以发布一个通用的伪代码,我可以效仿来做这个?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-03-17 11:01:38

如果你不知道你有多少个“组”,我想你至少有一些所有组的集合?即所有向量的数组/向量?

如果是这样的话,这里有一个大概的想法

代码语言:javascript
运行
复制
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循环相同的代码,但将其编写为递归函数要简单得多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5334073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档