以递归方式从固定步骤生成数​​组

时间:2015-08-22 14:53:02

标签: java arrays recursion

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

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)的数量事先不知道,那么它是我应该用来递归控制调用的变量吗?

2 个答案:

答案 0 :(得分:1)

目前您的解释与您的示例相矛盾。如果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?):< / p>

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]

如果您还想要其他内容,请澄清问题(至少提供完整的预期输出)。

答案 1 :(得分:0)

感谢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]