我想使此处的d动态,即,我希望能够在不事先知道d值的情况下生成数组值的所有可能组合。
现在,我正在使用if子句,并且我只能支持d到1到4。
这些是输入参数:d,max,min和sz。
if( d == 4 )
{
for( double i = min ; i <= max ; i = i+ sz )
{
for( double j = min ; j <= max ; j = j + sz )
{
for( double h = min ; h<=max ; h = h + sz )
{
for( double p = min ; p<=max ; p = p + sz )
{
double[] att = {i, j, h, p};
}
}
}
}
}
if( d == 3 )
{
for( double i = min ; i <= max ; i = i+ sz )
{
for( double j = min ; j <= max ; j = j + sz )
{
for( double h = min ; h<=max ; h = h + sz )
{
double[] att = {i, j, h};
}
}
}
}
if( d == 2 )
{
for( double i = min ; i <= max ; i = i+ sz )
{
for( double j = min ; j <= max ; j = j + sz )
{
double[] att = {i, j};
}
}
}
if( d == 1 )
{
for( double i = min ; i <= max ; i = i+ sz )
{
double[] att = {i, j};
}
}
如您所见,如果我之前不知道d的值,我将无法做到。
还有一件事,我不想使用任何模板或诸如List等的预定义类。
递归是您的朋友。对预定义类的限制使代码有些丑陋,但功能应相同。从复杂度的角度来看,这也是非常糟糕的(递归时会创建很多额外的对象),但是如果您确实想要可变数量的嵌套循环,这是可行的方法。
private static void makeAtt(double min, double max, double sz, int depth, double[] vals){
//Guard against bad depth
if (depth < 0) return;
if (depth == 0){
System.out.print("{");
for(double d : vals){
System.out.print(d + " ");
}
System.out.print("}\n\n");
}
else{
for(double i = min; i < max; i += sz){
double[] newVals = new double[vals.length + 1];
for(int z = 0; z < vals.length; z++) newVals[z] = vals[z];
newVals[vals.length] = i;
makeAtt(min, max, sz, depth - 1, newVals);
}
}
}
这是运行的示例:
public static void main(String[] args){
makeAtt(0, 3, 1, 3, new double[0]);
}
输出:
{0.0 0.0 0.0}
{0.0 0.0 1.0}
{0.0 0.0 2.0}
{0.0 1.0 0.0}
{0.0 1.0 1.0}
{0.0 1.0 2.0}
{0.0 2.0 0.0}
{0.0 2.0 1.0}
{0.0 2.0 2.0}
{1.0 0.0 0.0}
{1.0 0.0 1.0}
{1.0 0.0 2.0}
{1.0 1.0 0.0}
{1.0 1.0 1.0}
{1.0 1.0 2.0}
{1.0 2.0 0.0}
{1.0 2.0 1.0}
{1.0 2.0 2.0}
{2.0 0.0 0.0}
{2.0 0.0 1.0}
{2.0 0.0 2.0}
{2.0 1.0 0.0}
{2.0 1.0 1.0}
{2.0 1.0 2.0}
{2.0 2.0 0.0}
{2.0 2.0 1.0}
{2.0 2.0 2.0}
不过要注意一点;我的代码和您的原始答案实际上都会生成所有可能的排列,而不是组合。如果要组合,则应使每个数字从前一个数字开始,然后递增,而不是最小。由于设置了递归,因此您要做的就是将递归调用更改为:
makeAtt(i, max, sz, depth - 1, newVals);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句