基本上我有n
个双打,每个都可以在一定范围内有任何值(每个值的范围不同)。我想要一个C ++函数,它可以在给定一定间隔n
的情况下生成这些i
值的所有可能排列(这也可能因每个值而异)。
例如,如果n = 2
,i = 0.5
(对于这两个值),min(0) = 0
,max(0) = 1
,min(1) = 0.5
,max(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。订单无关紧要。
答案 0 :(得分:2)
由于您在递归方面遇到困难,请避免使用它。看一下输出中的重复模式:
第一列包含列表(0.0,0.5,1.0)。我认为你知道如何使用for循环来获取这些。
第二列包含列表的重复块(0.5,1.0,1.5)。同样,我认为你知道如何使用for循环。第一列中的每个值都有一个这样的块。
您只需考虑三个列表:正在处理的列左侧列的解决方案,当前处理的列应采用的值以及您正在构建的结果。
对于每一列,在列左列表和此列列表中使用嵌套循环,将每个组合放入构建输出中。完成一列后,将building-output移动到left-left结果并开始处理下一列。继续,直到添加所有列。
无论有多少列,您仍然只需要三个循环(一个遍历列号,一个遍历列左侧结果,一个跨越此列值)。由于循环嵌套深度是固定的,因此不需要递归。