我想基于两个输入递归生成数组:
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)的数量事先不知道,那么它是我应该用来递归控制调用的变量吗?
答案 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
时打印(为什么inatt
?inarr
?):< / 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]