我想编写一个 Java 方法来操作如下:
输入 1,输出 { {0},{1} }
输入 2,输出 { {0, 0}, {0, 1}, {1, 0}, {1, 1} }
输入 3,输出 { {0, 0, 0}, {0, 0, 1}, {0, 1, 0}, ... {1, 1, 1} }
...
(为了简洁,我在示例中使用 0 和 1;最低级别的子元素可能是 HIGH 和 LOW、'A' 和 'Z',或任何其他两个不同的值。)
这感觉像是一个很好的递归候选者,但这只是一种感觉。到目前为止,我所有的努力似乎都不是最理想的。* 除了使用不同的语言之外,还有什么好的方法吗?
* 例如:循环 0 到 (2^input)-1;将数字解释为 [输入] 位二进制值;使用二进制数字生成子数组。呸。
编辑:提出广义迭代解决方案
公共枚举项{
第 1 项,第 2 项,...;// 需要多少
私有静态最终 int ITEM_COUNT = values().length;
公共静态项目[][] allCombinationsOfSize(int comboSize) {
int arraySize = (int) Math.pow(ITEM_COUNT, comboSize);
项目数组[][] = 新项目[arraySize][];
for (int n = 0 ; n < arraySize ; ++n ) {
数组[n] = nthSubarray(n, comboSize);
}
返回数组;
}
私有静态项目 [] nthSubarray(int n, int comboSize) {
项目组合[] = 新项目[comboSize];
for (int i = comboSize - 1 ; i >= 0 ; --i ) {
组合[i] = Item.values()[n % ITEM_COUNT];
n /= ITEM_COUNT;
}
返回组合;
}
}
我相信 allCombinationsOfSize 是我正在寻找的方法。我仍然有一个偷偷摸摸的怀疑,我错过了一些更优雅的东西。尽管如此,以上内容允许我在我的 JUnit 测试中编写它......
对于(信号信号[]:Signal.allCombinationsOfSize(pinCount)){
断言等于(
cls.getSimpleName() + "结果",
预期结果(cls,信号),
actualResultFor(cls, 信号)
);
}
...这很简单。