生成在一定范围C ++内的一组双精度的所有排列

时间:2016-01-20 19:34:18

标签: c++ algorithm recursion permutation

基本上我有n个双打,每个都可以在一定范围内有任何值(每个值的范围不同)。我想要一个C ++函数,它可以在给定一定间隔n的情况下生成这些i值的所有可能排列(这也可能因每个值而异)。

例如,如果n = 2i = 0.5(对于这两个值),min(0) = 0max(0) = 1min(1) = 0.5max(1) = 1.5, min(0)是第一个值的下限,max(0)是第一个值的上限等,那么函数应该返回以下内容:

  - [0.0, 0.5]
  - [0.0, 1.0]
  - [0.0, 1.5]
  - [0.5, 0.5]
  - [0.5, 1.0]
  - [0.5, 1.5]
  - [1.0, 0.5]
  - [1.0, 1.0]
  - [1.0, 1.5]

在我到目前为止的实现中,我将间隔存储在大小为n的向量中,并且每个值的范围存储在std::pair<double, double>个对象的向量中,其中第一个值对应于较低的值限制,第二个值对应上限。我有点不知道下一步该做什么,遗憾的是不太适合递归。我只需要一个简短的伪代码即可实现。

P.S。订单无关紧要。

1 个答案:

答案 0 :(得分:2)

由于您在递归方面遇到困难,请避免使用它。看一下输出中的重复模式:

第一列包含列表(0.0,0.5,1.0)。我认为你知道如何使用for循环来获取这些。

第二列包含列表的重复块(0.5,1.0,1.5)。同样,我认为你知道如何使用for循环。第一列中的每个值都有一个这样的块。

您只需考虑三个列表:正在处理的列左侧列的解决方案,当前处理的列应采用的值以及您正在构建的结果。

对于每一列,在列左列表和此列列表中使用嵌套循环,将每个组合放入构建输出中。完成一列后,将building-output移动到left-left结果并开始处理下一列。继续,直到添加所有列。

无论有多少列,您仍然只需要三个循环(一个遍历列号,一个遍历列左侧结果,一个跨越此列值)。由于循环嵌套深度是固定的,因此不需要递归。