从固定步骤递归生成数组



我想基于两个输入递归生成数组:

1( 输入阵列,例如double[] in={0.25, 0.25, 0.5};

2( 步长,例如double step = 0.25;

函数foo()应该接受这两个输入并生成以下数组:

{0.5, 0.25, 0.5} (add step 0.25 to first element)

{0.0, 0.25, 0.5} (subtract 0.25 from first element)

等等

所有2^d组合(此处d=3(。但我想递归地执行,而不指定维度(d(。

public void foo( double[] inatt, double[] outatt, double step, int d) 
{
   if( d = 0 )
   {
       // should print the array outatt:
   }
   else
   {
      outatt[d] = inatt[d]+step;
      foo( inatt, outatt, step, d-1);
   }
}

我不知道如何组织递归函数内部的调用。。我想,如果维度(d(的数量事先不知道,那么它就是我应该用来递归控制调用的变量吗?

目前您的解释与您的示例相矛盾。如果d=3有8个组合,我假设您希望组合像(add, add, add)(add, add, subtract)…这样的操作。。。,(subtract, subtract, add)(subtract, subtract, subtract)。然而,在您的示例中有(add, no-change, no-change)(subtract, no-change, no-change)。我认为那个例子不正确。

我建议添加d而不是减法,从0开始,当d == inatt.length时打印(为什么是inattinarr?(:

public void foo( double[] inatt, double[] outatt, double step, int d) 
{
   if( d == inatt.length )
   {
       System.out.println(Arrays.toString(outatt));
   }
   else
   {
      outatt[d] = inatt[d]+step;
      foo( inatt, outatt, step, d+1);
      outatt[d] = inatt[d]-step;
      foo( inatt, outatt, step, d+1);
   }
} 

输入(foo(new double[] {0.25, 0.25, 0.5}, new double[3], 0.25, 0);(的结果为:

[0.5, 0.5, 0.75]
[0.5, 0.5, 0.25]
[0.5, 0.0, 0.75]
[0.5, 0.0, 0.25]
[0.0, 0.5, 0.75]
[0.0, 0.5, 0.25]
[0.0, 0.0, 0.75]
[0.0, 0.0, 0.25]

如果你想要其他东西,请澄清这个问题(至少提供完整的预期输出(。

多亏了Tagir,我用他有用的代码找到了解决方案。数组中的每个元素都有三种情况:加步长、减步长或不更改。

递归调用从数组中的第一个元素开始,然后一直持续到最后一个元素。

public static void foo( double[] inatt, double[] outatt, double step, int d) 
    {
        if( d == inatt.length )
        {
            System.out.println(Arrays.toString(outatt));
        }
        else
        {
           outatt[d] = inatt[d]+step;
           foo( inatt, outatt, step, d+1);
           outatt[d] = inatt[d]-step;
           foo( inatt, outatt, step, d+1);
           outatt[d] = inatt[d];
           foo( inatt, outatt, step, d+1);
        }
    } 

对于输入阵列:

        double[] att={0.25, 0.5};
        double step = 0.25;

这是输出:

foo(att, new double[d], delta, 0);
[0.5, 0.75]
[0.5, 0.25]
[0.5, 0.5]
[0.0, 0.75]
[0.0, 0.25]
[0.0, 0.5]
[0.25, 0.75]
[0.25, 0.25]
[0.25, 0.5]

最新更新