生成动态大小为d的所有可能组合?

贾维斯

我想使此处的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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

R从n个元素的字符向量中生成大小为m的所有可能组合

用大小为n列表的所有可能的组合ķ

大小为 n 算法的所有可能组合和排列

为Google SpreadSheets中的列生成所有可能的组合

生成所有可能的组合

[Python]:生成并组合所有可能的组合

以动态顺序尝试所有可能的组合

生成所有可能的精选组合

生成所有可能的组合-Java

用PHP生成所有可能的组合

如何生成所有可能的组合?

生成所有可能的正确/错误组合

生成所有可能的组合效率低下

以最快的方式生成所有可能的组合

在 SQL 中生成所有可能的组合?

Python生成矩阵的所有可能组合

在Python中生成所有可能的组合

如何为按不同大小分组的元素列表生成所有可能的组合?

Python生成对角线条目为零的矩阵的所有可能组合

从给定的单词列表中生成长度为“ N”的所有可能组合(寻找不重复)

生成长度为6的字母和数字的所有可能组合时出现MemoryError

如何生成总和为 1 的三个变量的所有可能组合

python:如何创建以元组形式为A和B的整数生成所有可能组合的东西

为列表中所有字符串组合的可能输出生成逻辑

生成所有可能组合(物种组合)的numpy数组

为组合的所有可能组合优化效率

递归生成给定子集大小的所有组合(C ++)

获取的比特大小N所有可能的比特组合

生成带有变量的句子的所有可能组合